diff options
| author | Max Audron <audron@cocaine.farm> | 2025-02-26 22:52:16 +0100 |
|---|---|---|
| committer | Max Audron <audron@cocaine.farm> | 2025-02-26 22:58:03 +0100 |
| commit | a130eee7a71996f9ae50502c477a2c6494b78a83 (patch) | |
| tree | 39d5e659ad1d537728757aa542968cb49b06bd35 /derive/src/network | |
| parent | implement IdentityId (diff) | |
implement NetworkId UserType
Diffstat (limited to 'derive/src/network')
| -rw-r--r-- | derive/src/network/list.rs | 64 | ||||
| -rw-r--r-- | derive/src/network/map.rs | 42 | ||||
| -rw-r--r-- | derive/src/network/maplist.rs | 64 |
3 files changed, 91 insertions, 79 deletions
diff --git a/derive/src/network/list.rs b/derive/src/network/list.rs index 973444e..1fc8f7e 100644 --- a/derive/src/network/list.rs +++ b/derive/src/network/list.rs @@ -43,19 +43,31 @@ pub(crate) fn from(fields: &Vec<NetworkField>) -> Vec<TokenStream> { .map(|field| { let field_name = field.ident.as_ref().unwrap(); - if field.default { + let field_rename = match &field.rename { + Some(name) => name.clone(), + None => format!("{}", field.ident.as_ref().unwrap()).into(), + }; + + let field_variant_type = get_field_variant_type(&field); + + let extract_inner = if field.default { quote! { - #field_name: Default::default(), + let mut i = input.iter(); + match i.position(|x| *x == libquassel::primitive::Variant::ByteArray(String::from(#field_rename))) { + Some(_) => { + match i.next().expect("failed to get next field") { + libquassel::primitive::Variant::#field_variant_type(var) => var + .clone() + .try_into() + .unwrap_or(Default::default()), + _ => Default::default(), + } + } + None => Default::default(), + } } } else { - let field_rename = match &field.rename { - Some(name) => name.clone(), - None => format!("{}", field.ident.as_ref().unwrap()).into(), - }; - - let field_variant_type = get_field_variant_type(&field); - - let extract_inner = quote! { + quote! { let mut i = input.iter(); i.position(|x| *x == libquassel::primitive::Variant::ByteArray(String::from(#field_rename))) .expect(format!("failed to get field {}", #field_rename).as_str()); @@ -64,25 +76,25 @@ pub(crate) fn from(fields: &Vec<NetworkField>) -> Vec<TokenStream> { libquassel::primitive::Variant::#field_variant_type(var) => var.clone().try_into().unwrap(), _ => panic!("network::list::from: wrong variant type"), } - }; + } + }; - match field.network { - super::NetworkRepr::List => quote! { - #field_name: libquassel::message::NetworkList::from_network_list(&mut { - #extract_inner - }), - }, - super::NetworkRepr::Map => quote! { - #field_name: libquassel::message::NetworkMap::from_network_map(&mut { - #extract_inner - }), - }, - super::NetworkRepr::None => quote! { - #field_name: { + match field.network { + super::NetworkRepr::List => quote! { + #field_name: libquassel::message::NetworkList::from_network_list(&mut { #extract_inner - }, + }), }, - } + super::NetworkRepr::Map => quote! { + #field_name: libquassel::message::NetworkMap::from_network_map(&mut { + #extract_inner + }), + }, + super::NetworkRepr::None => quote! { + #field_name: { + #extract_inner + }, + }, } }) .collect() diff --git a/derive/src/network/map.rs b/derive/src/network/map.rs index 0550ccb..4efc3bf 100644 --- a/derive/src/network/map.rs +++ b/derive/src/network/map.rs @@ -45,29 +45,29 @@ pub(crate) fn from(fields: &Vec<NetworkField>) -> Vec<TokenStream> { .map(|field| { let field_name = field.ident.as_ref().unwrap(); - if field.default { - quote! { - #field_name: Default::default(), - } + let unwrap = if field.default { + quote! { unwrap_or_default() } } else { - let field_rename = match &field.rename { - Some(name) => name.clone(), - None => format!("{}", field.ident.as_ref().unwrap()).into(), - }; + quote! { unwrap() } + }; - match field.network { - super::NetworkRepr::List => quote! { - #field_name: libquassel::message::NetworkList::from_network_list( - &mut std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).unwrap()), - }, - super::NetworkRepr::Map => quote! { - #field_name: libquassel::message::NetworkMap::from_network_map( - &mut std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).unwrap()), - }, - super::NetworkRepr::None => quote! { - #field_name: std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).unwrap(), - }, - } + let field_rename = match &field.rename { + Some(name) => name.clone(), + None => format!("{}", field.ident.as_ref().unwrap()).into(), + }; + + match field.network { + super::NetworkRepr::List => quote! { + #field_name: libquassel::message::NetworkList::from_network_list( + &mut std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).#unwrap), + }, + super::NetworkRepr::Map => quote! { + #field_name: libquassel::message::NetworkMap::from_network_map( + &mut std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).#unwrap), + }, + super::NetworkRepr::None => quote! { + #field_name: std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).#unwrap, + }, } }) .collect() diff --git a/derive/src/network/maplist.rs b/derive/src/network/maplist.rs index 8ce18c5..b5b4a86 100644 --- a/derive/src/network/maplist.rs +++ b/derive/src/network/maplist.rs @@ -137,42 +137,42 @@ pub(crate) fn from(fields: &Vec<NetworkField>) -> Vec<TokenStream> { .map(|field| { let field_name = field.ident.as_ref().unwrap(); - if field.default { + let unwrap = if field.default { + quote! { unwrap_or_default() } + } else { + quote! { unwrap() } + }; + + let field_rename = match &field.rename { + Some(name) => name.clone(), + None => format!("{}", field.ident.as_ref().unwrap()).into(), + }; + + let field_inner = match field.network { + super::NetworkRepr::List => quote! { + libquassel::message::NetworkList::from_network_list(&mut std::convert::TryInto::try_into(input.remove(0)).#unwrap) + }, + super::NetworkRepr::Map => quote! { + libquassel::message::NetworkMap::from_network_map(&mut std::convert::TryInto::try_into(input.remove(0)).#unwrap) + }, + super::NetworkRepr::None => quote! { + std::convert::TryInto::try_into(input.remove(0)).#unwrap + }, + }; + + if field.stringlist { quote! { - #field_name: Default::default(), + #field_name: match input.get_mut(#field_rename).unwrap() { + libquassel::primitive::Variant::StringList(input) => #field_inner, + _ => panic!("#field_name: wrong variant") + }, } } else { - let field_rename = match &field.rename { - Some(name) => name.clone(), - None => format!("{}", field.ident.as_ref().unwrap()).into(), - }; - - let field_inner = match field.network { - super::NetworkRepr::List => quote! { - libquassel::message::NetworkList::from_network_list(&mut std::convert::TryInto::try_into(input.remove(0)).unwrap()) - }, - super::NetworkRepr::Map => quote! { - libquassel::message::NetworkMap::from_network_map(&mut std::convert::TryInto::try_into(input.remove(0)).unwrap()) - }, - super::NetworkRepr::None => quote! { - std::convert::TryInto::try_into(input.remove(0)).unwrap() + quote! { + #field_name: match input.get_mut(#field_rename).unwrap() { + libquassel::primitive::Variant::VariantList(input) => #field_inner, + _ => panic!("#field_name: wrong variant") }, - }; - - if field.stringlist { - quote! { - #field_name: match input.get_mut(#field_rename).unwrap() { - libquassel::primitive::Variant::StringList(input) => #field_inner, - _ => panic!("#field_name: wrong variant") - }, - } - } else { - quote! { - #field_name: match input.get_mut(#field_rename).unwrap() { - libquassel::primitive::Variant::VariantList(input) => #field_inner, - _ => panic!("#field_name: wrong variant") - }, - } } } }) |
