#![allow(deprecated)]
use std::path::PathBuf;
use serde::Deserialize;
use serde_bser::bytestring::ByteString;
use crate::prelude::*;
#[doc(hidden)]
pub trait QueryFieldName {
fn field_name() -> &'static str;
}
#[doc(hidden)]
pub trait QueryFieldList {
fn field_list() -> Vec<&'static str>;
}
macro_rules! define_field {(
$(#[$meta:meta])*
$tyname:ident, $ty:ty, $field_name:literal) => {
#[derive(Deserialize, Clone, Debug)]
$(#[$meta])*
pub struct $tyname {
#[serde(rename = $field_name)]
val: $ty,
}
impl QueryFieldName for $tyname {
fn field_name() -> &'static str {
$field_name
}
}
impl $tyname {
pub fn new(val: $ty) -> Self {
$tyname {
val,
}
}
pub fn into_inner(self) -> $ty {
self.val
}
}
impl std::ops::Deref for $tyname {
type Target = $ty;
fn deref(&self) -> &Self::Target {
&self.val
}
}
impl std::ops::DerefMut for $tyname {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.val
}
}
};
}
define_field!(
NameField,
PathBuf,
"name"
);
define_field!(
BytesNameField,
ByteString,
"name"
);
define_field!(
ExistsField,
bool,
"exists"
);
define_field!(
CreatedClockField,
ClockSpec,
"cclock"
);
define_field!(
ObservedClockField,
ClockSpec,
"oclock"
);
define_field!(
ContentSha1HexField,
ContentSha1Hex,
"content.sha1hex"
);
define_field!(
CTimeField,
i64,
"ctime"
);
define_field!(
CTimeAsFloatField,
f32,
"ctime_f"
);
define_field!(
MTimeField,
i64,
"mtime"
);
define_field!(
MTimeAsFloatField,
f32,
"mtime_f"
);
define_field!(
SizeField,
u64,
"size"
);
define_field!(
ModeAndPermissionsField,
u64,
"mode"
);
define_field!(
OwnerUidField,
u32,
"uid"
);
define_field!(
OwnerGidField,
u32,
"gid"
);
define_field!(
InodeNumberField,
u64,
"ino"
);
define_field!(
DeviceNumberField,
u64,
"dev"
);
define_field!(
NumberOfLinksField,
u64,
"nlink"
);
define_field!(
FileTypeField,
FileType,
"type"
);
define_field!(
SymlinkTargetField,
Option<String>,
"symlink_target"
);
define_field!(
#[deprecated(note = "NewField can have counter-intuitive \
values in a number of situations so it \
is recommended that you track \
ExistsField instead")]
NewField,
bool,
"new"
);
#[macro_export]
macro_rules! query_result_type {(
$struct_vis:vis struct $tyname:ident {
$($field_vis:vis $field_name:ident : $field_ty:ty),+ $(,)?
}
) => (
#[derive(Deserialize, Debug, Clone)]
$struct_vis struct $tyname {
$(
#[serde(flatten)]
$field_vis $field_name: $field_ty,
)*
}
impl QueryFieldList for $tyname {
fn field_list() -> Vec <&'static str> {
vec![
$(
<$field_ty>::field_name(),
)*
]
}
}
)
}
#[derive(Deserialize, Debug, Clone)]
#[serde(from = "PathBuf")]
pub struct NameOnly {
pub name: NameField,
}
impl QueryFieldList for NameOnly {
fn field_list() -> Vec<&'static str> {
vec!["name"]
}
}
impl From<PathBuf> for NameOnly {
fn from(path: PathBuf) -> Self {
Self {
name: NameField { val: path },
}
}
}
#[derive(Deserialize, Debug, Clone)]
pub struct NoField {}
impl QueryFieldList for NoField {
fn field_list() -> Vec<&'static str> {
vec![]
}
}