diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 00000000..617841b2 --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,25 @@ +name: Rust + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v3 + - name: Build + run: cargo build --verbose + - name: Run tests + run: cargo test --verbose diff --git a/app/src/manager/folder.rs b/app/src/manager/folder.rs index 31b633cd..6f018c2e 100644 --- a/app/src/manager/folder.rs +++ b/app/src/manager/folder.rs @@ -65,12 +65,19 @@ impl<'a> Folder<'a> { let v = self.is_find.then_some(()).and_then(|_| { let finder = self.cx.manager.active().finder()?; - let (head, body, tail) = finder.explode(short.name)?; + #[cfg(target_os = "windows")] + let (head, body, tail) = finder.explode(short.name.to_string_lossy().as_bytes())?; + + #[cfg(not(target_os = "windows"))] + let (head, body, tail) = { + use std::os::unix::ffi::OsStrExt; + finder.explode(short.name.as_bytes())? + }; // TODO: to be configured by THEME? let style = Style::new().fg(Color::Rgb(255, 255, 50)).add_modifier(Modifier::ITALIC); Some(vec![ - Span::raw(short.prefix.join(head.as_ref()).display().to_string()), + Span::raw(short.prefix.join(head).display().to_string()), Span::styled(body, style), Span::raw(tail), ]) diff --git a/core/src/manager/finder.rs b/core/src/manager/finder.rs index e6a7cea1..414de6b2 100644 --- a/core/src/manager/finder.rs +++ b/core/src/manager/finder.rs @@ -1,4 +1,4 @@ -use std::{borrow::Cow, collections::BTreeMap, ffi::OsStr}; +use std::{collections::BTreeMap, ffi::OsStr}; use anyhow::Result; use regex::bytes::Regex; @@ -111,21 +111,12 @@ impl Finder { /// Explode the name into three parts: head, body, tail. #[inline] - pub fn explode<'a>(&self, name: &'a OsStr) -> Option<(Cow<'a, str>, Cow<'a, str>, Cow<'a, str>)> { - #[cfg(target_os = "windows")] - let b = { name.to_string_lossy().as_bytes() }; - - #[cfg(not(target_os = "windows"))] - let b = { - use std::os::unix::ffi::OsStrExt; - name.as_bytes() - }; - - let range = self.query.find(b).map(|m| m.range())?; + pub fn explode(&self, name: &[u8]) -> Option<(String, String, String)> { + let range = self.query.find(name).map(|m| m.range())?; Some(( - String::from_utf8_lossy(&b[..range.start]), - String::from_utf8_lossy(&b[range.start..range.end]), - String::from_utf8_lossy(&b[range.end..]), + String::from_utf8_lossy(&name[..range.start]).to_string(), + String::from_utf8_lossy(&name[range.start..range.end]).to_string(), + String::from_utf8_lossy(&name[range.end..]).to_string(), )) } } diff --git a/shared/src/fs.rs b/shared/src/fs.rs index 04801be6..66b260f3 100644 --- a/shared/src/fs.rs +++ b/shared/src/fs.rs @@ -172,6 +172,7 @@ pub fn max_common_root(files: &[impl AsRef]) -> PathBuf { root } +#[cfg(not(target_os = "windows"))] #[test] fn test_max_common_root() { assert_eq!(max_common_root(&[] as &[PathBuf]).as_os_str(), "");