yazi/yazi-fs/src/file/file_extra.rs
三咲雅 misaki masa 9accf929f4
Some checks are pending
Cachix / Publish Flake (push) Waiting to run
Check / clippy (push) Waiting to run
Check / rustfmt (push) Waiting to run
Check / stylua (push) Waiting to run
Draft / build-unix (gcc-aarch64-linux-gnu, ubuntu-latest, aarch64-unknown-linux-gnu) (push) Waiting to run
Draft / build-unix (gcc-i686-linux-gnu, ubuntu-latest, i686-unknown-linux-gnu) (push) Waiting to run
Draft / build-unix (gcc-riscv64-linux-gnu, ubuntu-latest, riscv64gc-unknown-linux-gnu) (push) Waiting to run
Draft / build-unix (gcc-sparc64-linux-gnu, ubuntu-latest, sparc64-unknown-linux-gnu) (push) Waiting to run
Draft / build-unix (macos-latest, aarch64-apple-darwin) (push) Waiting to run
Draft / build-unix (macos-latest, x86_64-apple-darwin) (push) Waiting to run
Draft / build-unix (ubuntu-latest, x86_64-unknown-linux-gnu) (push) Waiting to run
Draft / build-windows (windows-latest, aarch64-pc-windows-msvc) (push) Waiting to run
Draft / build-windows (windows-latest, x86_64-pc-windows-msvc) (push) Waiting to run
Draft / build-musl (aarch64-unknown-linux-musl) (push) Waiting to run
Draft / build-musl (x86_64-unknown-linux-musl) (push) Waiting to run
Draft / build-snap (amd64, ubuntu-latest) (push) Waiting to run
Draft / build-snap (arm64, ubuntu-24.04-arm) (push) Waiting to run
Draft / snap (push) Blocked by required conditions
Draft / draft (push) Blocked by required conditions
Draft / nightly (push) Blocked by required conditions
Test / test (macos-latest) (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
Test / test (windows-latest) (push) Waiting to run
feat: trash bin (#4144)
2026-07-22 03:13:58 +08:00

67 lines
1.8 KiB
Rust

use std::{path::{Path, PathBuf}, sync::Arc};
use mlua::{FromLua, Lua, Table, Value};
use serde::{Deserialize, Serialize};
use serde_with::{TryFromInto, serde_as};
use yazi_shared::path::PathBufDyn;
#[repr(transparent)]
#[derive(Clone, Debug, Default)]
pub struct FileExtra(Option<Arc<FileExtraInner>>);
#[serde_as]
#[derive(Debug, Default, Deserialize, Serialize)]
struct FileExtraInner {
link_to: Option<PathBufDyn>,
#[serde_as(as = "Option<TryFromInto<PathBufDyn>>")]
backing: Option<PathBuf>,
}
impl FileExtra {
#[inline]
pub fn new(link_to: Option<PathBufDyn>, backing: Option<PathBuf>) -> Self {
Self(
(link_to.is_some() || backing.is_some())
.then(|| Arc::new(FileExtraInner { link_to, backing })),
)
}
#[inline]
pub fn link_to(&self) -> Option<&PathBufDyn> { self.0.as_ref()?.link_to.as_ref() }
#[inline]
pub fn backing(&self) -> Option<&Path> { self.0.as_ref()?.backing.as_deref() }
}
impl TryFrom<Table> for FileExtra {
type Error = mlua::Error;
fn try_from(value: Table) -> Result<Self, Self::Error> {
Ok(Self::new(
value.raw_get("link_to")?,
value.raw_get::<Option<PathBufDyn>>("backing")?.map(PathBufDyn::into_os).transpose()?,
))
}
}
impl Serialize for FileExtra {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match &self.0 {
Some(inner) => inner.serialize(serializer),
None => FileExtraInner::default().serialize(serializer),
}
}
}
impl<'de> Deserialize<'de> for FileExtra {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let inner = FileExtraInner::deserialize(deserializer)?;
Ok(Self::new(inner.link_to, inner.backing))
}
}
impl FromLua for FileExtra {
fn from_lua(value: Value, lua: &Lua) -> mlua::Result<Self> {
Table::from_lua(value, lua)?.try_into()
}
}