feat(tvix/nix-compat-derive): Add deriver for NixDeserialize
This adds a nix-compat-derive derive crate that implements a deriver for NixDeserialize implementations. This is to reduce the amount of code needed to implement deserialization for all the types used by the Nix daemon protocol. Change-Id: I484724b550e8a1d5e9adad9555d9dc1374ae95c2 Reviewed-on: https://cl.tvl.fyi/c/depot/+/12022 Autosubmit: Brian Olsen <me@griff.name> Tested-by: BuildkiteCI Reviewed-by: flokli <flokli@flokli.de>
This commit is contained in:
parent
9af6920478
commit
ced05a2bb6
48 changed files with 2376 additions and 3 deletions
110
tvix/nix-compat-derive/src/internal/inputs.rs
Normal file
110
tvix/nix-compat-derive/src/internal/inputs.rs
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct RemoteInput {
|
||||
pub attrs: Vec<syn::Attribute>,
|
||||
pub ident: syn::Type,
|
||||
}
|
||||
|
||||
impl syn::parse::Parse for RemoteInput {
|
||||
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
|
||||
let attrs = input.call(syn::Attribute::parse_outer)?;
|
||||
|
||||
let ident = input.parse::<syn::Type>()?;
|
||||
Ok(RemoteInput { attrs, ident })
|
||||
}
|
||||
}
|
||||
|
||||
impl quote::ToTokens for RemoteInput {
|
||||
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
|
||||
fn is_outer(attr: &&syn::Attribute) -> bool {
|
||||
match attr.style {
|
||||
syn::AttrStyle::Outer => true,
|
||||
syn::AttrStyle::Inner(_) => false,
|
||||
}
|
||||
}
|
||||
for attr in self.attrs.iter().filter(is_outer) {
|
||||
attr.to_tokens(tokens);
|
||||
}
|
||||
self.ident.to_tokens(tokens);
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use syn::parse_quote;
|
||||
//use syn::parse::Parse;
|
||||
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_input() {
|
||||
let p: RemoteInput = parse_quote!(u64);
|
||||
assert_eq!(
|
||||
p,
|
||||
RemoteInput {
|
||||
attrs: vec![],
|
||||
ident: parse_quote!(u64),
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_input_attr() {
|
||||
let p: RemoteInput = parse_quote!(
|
||||
#[nix]
|
||||
u64
|
||||
);
|
||||
assert_eq!(
|
||||
p,
|
||||
RemoteInput {
|
||||
attrs: vec![parse_quote!(#[nix])],
|
||||
ident: parse_quote!(u64),
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_input_attr_multiple() {
|
||||
let p: RemoteInput = parse_quote!(
|
||||
#[nix]
|
||||
#[hello]
|
||||
u64
|
||||
);
|
||||
assert_eq!(
|
||||
p,
|
||||
RemoteInput {
|
||||
attrs: vec![parse_quote!(#[nix]), parse_quote!(#[hello])],
|
||||
ident: parse_quote!(u64),
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_input_attr_full() {
|
||||
let p: RemoteInput = parse_quote!(
|
||||
#[nix(try_from = "u64")]
|
||||
usize
|
||||
);
|
||||
assert_eq!(
|
||||
p,
|
||||
RemoteInput {
|
||||
attrs: vec![parse_quote!(#[nix(try_from="u64")])],
|
||||
ident: parse_quote!(usize),
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_input_attr_other() {
|
||||
let p: RemoteInput = parse_quote!(
|
||||
#[muh]
|
||||
u64
|
||||
);
|
||||
assert_eq!(
|
||||
p,
|
||||
RemoteInput {
|
||||
attrs: vec![parse_quote!(#[muh])],
|
||||
ident: parse_quote!(u64),
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue