Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F36223
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/rust/lib.rs b/rust/lib.rs
index 52b861d..a0f0faf 100644
--- a/rust/lib.rs
+++ b/rust/lib.rs
@@ -1,68 +1,71 @@
mod matcher;
mod finder;
mod sorter;
mod thread_pool;
use std::sync::Mutex;
use std::collections::HashMap;
use std::os::raw::{c_int, c_char};
use std::ffi::CString;
use std::ffi::CStr;
#[macro_use]
extern crate lazy_static;
lazy_static! {
static ref GLOBAL_FILE_CACHE: Mutex<HashMap<String, Vec<String>>> = return Mutex::new(HashMap::new()) ;
}
fn to_string(input: *const c_char) -> String {
return unsafe { CStr::from_ptr(input) }.to_str().unwrap().to_string();
}
fn get_files(directory: &String) -> Vec<String> {
let mut cache = GLOBAL_FILE_CACHE.lock().unwrap();
if !cache.contains_key(directory) {
let finder_options = finder::Options{ directory: directory.clone() };
cache.insert( directory.clone(), finder::find_files(finder_options));
}
return cache.get(directory).unwrap().to_vec();
}
#[no_mangle]
-pub extern "C" fn ivy_init() {}
+pub extern "C" fn ivy_init(c_base_dir: *const c_char) {
+ let directory = to_string(c_base_dir);
+ get_files(&directory);
+}
#[no_mangle]
pub extern "C" fn ivy_match(c_pattern: *const c_char, c_text: *const c_char) -> c_int {
let pattern = to_string(c_pattern);
let text = to_string(c_text);
let m = matcher::Matcher{ pattern };
return m.score(text) as i32;
}
#[no_mangle]
pub extern "C" fn ivy_files(c_pattern: *const c_char, c_base_dir: *const c_char) -> *const c_char {
let pattern = to_string(c_pattern);
let directory = to_string(c_base_dir);
// Bail out early if the pattern is empty its never going to find anything
if pattern.is_empty() {
return CString::new("").unwrap().into_raw()
}
let files = get_files(&directory);
let mut output = String::new();
let sorter_options = sorter::Options::new(pattern);
let files = sorter::sort_strings(sorter_options, files);
for file in files.lock().unwrap().iter() {
output.push_str(&file.content);
output.push('\n');
}
return CString::new(output).unwrap().into_raw()
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Mon, Mar 9, 8:41 PM (3 w, 2 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
9032
Default Alt Text
(2 KB)
Attached To
Mode
R1 ivy.nvim
Attached
Detach File
Event Timeline
Log In to Comment