STEP14
기본 기능은 완료했으니 살을 붙여보자.
앞에서 소개한 rust_search crate에는 여러가지 속성을 부여할 수 있다.
지금까지는 file search 만 구현하였으나 directory search및 hidden 파일 그리고
strict mode도 추가해보자.
index.html에서 hidden, strict mode를 선택할것인지 check box를 추가해보자
'id-check-hidden', 'id-check-strict'
<div class="row" name="defaultDiv">
<input id="id-input-search-main" class="focusableInput" tabindex="0" placeholder="file or dir name" />
<input id="id-input-search-ext" class="focusableInput" tabindex="1" placeholder="extension" />
<input class="check" type="checkbox" id="id-check-hidden" name="name-check-hidden" unchecked />
<label for="name-check-hidden">hidden file</label>
<input class="check" type="checkbox" id="id-check-strict" name="name-check-strict" unchecked />
<label for="name-check-strict">strict</label>
</div>
main.js에도 각각의 id를 추가해준다.
let inputSearchExt = document.querySelector("#id-input-search-ext");
let inputCheckHidden = document.querySelector("#id-check-hidden");
let inputCheckStrict = document.querySelector("#id-check-strict");
let inputLocation = document.querySelector("#id-input-location");
init() 에서 inputCheckHidden과 inputCheckStrict 의 초기값도 설정해준다.
그리고, 가장 중요한..
Run 버튼 클릭시 hidden과 strict 속성 값을 전달해야하므로, 아래처럼 parameter를 추가해야한다.
await invoke(callbackName, {
locStart: inputLocation.value, inSearch: tempMain,
limit: Number("100"), ext: tempExt,
depth: Number("10"), hidden: inputCheckHidden.checked, strict: inputCheckStrict.checked
});
당연히 search.rs 에서도 parameter를 추가해준다.
#[tauri::command]
pub fn do_search_file(loc_start: &str, in_search: &str,
limit: usize, ext: &str, depth: usize, hidden: bool, strict: bool)
{
builder에 strict, hidden 옵션에 대해서 선택 추가 가능하도록 코드를 추가한다.
.depth(depth); // 깊이
if strict {
builder = builder.strict(); // 정확도
}
if hidden {
builder = builder.hidden(); // hidden file
}
let collected: Vec<String> = builder.build().collect();
테스트는 디렉토리 검색 기능 추가 후 한번에 해보도록 하겠다.
STEP15
directory 검색 코드는 아래와 같다.
#[tauri::command]
pub fn do_search_dir(loc_start: &str, in_search: &str, loc_more: Vec<&str>,
limit: usize, _ext: &str, depth: usize, hidden: bool, strict: bool)
{
init();
print!("do_search_dir\n");
//if in_search is '*' then change empty string
let in_search = if in_search == "*" { "" } else { in_search };
let mut builder = SearchBuilder::default()
.location(loc_start) // 검색 시작 위치
.search_input(in_search) // 찾을 파일 or DIR
.more_locations(loc_more) // 위치 추가
.limit(limit) // 갯수
.depth(depth) // 깊이
.custom_filter(|in_search| !in_search.metadata().unwrap().is_file()); // 디렉토리만 찾기
if strict {
builder = builder.strict(); // 정확도
}
if hidden {
builder = builder.hidden(); // hidden file
}
let collected: Vec<String> = builder.build().collect();
SINGLETON_SEARCH.lock().unwrap().search_result.borrow_mut().extend(collected);
SINGLETON_SEARCH.lock().unwrap().search_done = true;
}
file search와 차이점이 builder 생성시 .custom_filter 가 추가되는것밖에 없는듯하다.
https://docs.rs/rust_search/latest/rust_search/ 여기를 참고하면 된다.
그리고, FilterExt 트레잇을 추가해준다.
use rust_search::{SearchBuilder, FilterExt};
lib.rs에서 event handler에 do_search_dir 추가를 잊지 말자.
이제 빌드 > 테스트
/c/Users/suker/AppData ==> AppData는 hidden directory 이다.
요놈을 검색할 수 있다면 hidden 속성과, directory 검색 기능이 모두 완료된걸로 봐도 된다.
'*' 문자도 사용해서 strict mode도 잘 동작하는지 확인해보자.
directory와 file search를 구분하는 방법은 main.js의 run 함수에 답이 있으니 확인해보자.
hidden on / strict on 에서 정상적인 검색확인
strict on에서 * 문자를 섞어서 찾기 실패
strict off 시 검색 확인
commit : b394be1ac3489af213c700fdc3f03b4f05057072