mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
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
67 lines
1.8 KiB
Rust
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()
|
|
}
|
|
}
|