use std::collections::{HashMap, HashSet};
use super::input::PartialMode;
use crate::parser::extract_rename_all;
pub fn build_omit_set(omit: Option<&Vec<String>>) -> HashSet<String> {
omit.into_iter().flatten().cloned().collect()
}
pub fn build_pick_set(pick: Option<&Vec<String>>) -> HashSet<String> {
pick.into_iter().flatten().cloned().collect()
}
#[allow(clippy::ref_option)]
pub fn build_partial_config(partial: &Option<PartialMode>) -> (bool, HashSet<String>) {
let partial_all = matches!(partial, Some(PartialMode::All));
let partial_set: HashSet<String> = match partial {
Some(PartialMode::Fields(fields)) => fields.iter().cloned().collect(),
_ => HashSet::new(),
};
(partial_all, partial_set)
}
pub fn build_rename_map(rename: Option<&Vec<(String, String)>>) -> HashMap<String, String> {
rename.into_iter().flatten().cloned().collect()
}
pub fn extract_serde_attrs_without_rename_all(attrs: &[syn::Attribute]) -> Vec<&syn::Attribute> {
attrs
.iter()
.filter(|attr| {
if !attr.path().is_ident("serde") {
return false;
}
let mut has_rename_all = false;
let _ = attr.parse_nested_meta(|meta| {
if meta.path.is_ident("rename_all") {
has_rename_all = true;
}
Ok(())
});
!has_rename_all
})
.collect()
}
pub fn extract_doc_attrs(attrs: &[syn::Attribute]) -> Vec<&syn::Attribute> {
attrs
.iter()
.filter(|attr| attr.path().is_ident("doc"))
.collect()
}
pub fn determine_rename_all(
input_rename_all: Option<&String>,
source_attrs: &[syn::Attribute],
) -> String {
input_rename_all.map_or_else(
|| extract_rename_all(source_attrs).unwrap_or_else(|| "camelCase".to_string()),
std::clone::Clone::clone,
)
}
pub fn extract_field_serde_attrs(attrs: &[syn::Attribute]) -> Vec<&syn::Attribute> {
attrs
.iter()
.filter(|attr| attr.path().is_ident("serde"))
.collect()
}
pub fn extract_form_data_attrs(attrs: &[syn::Attribute]) -> Vec<&syn::Attribute> {
attrs
.iter()
.filter(|attr| attr.path().is_ident("form_data"))
.collect()
}
pub fn filter_out_serde_rename<'a>(attrs: &[&'a syn::Attribute]) -> Vec<&'a syn::Attribute> {
attrs
.iter()
.filter(|attr| {
let mut has_rename = false;
let _ = attr.parse_nested_meta(|meta| {
if meta.path.is_ident("rename") {
has_rename = true;
}
Ok(())
});
!has_rename
})
.copied()
.collect()
}
pub fn should_skip_field(
field_name: &str,
omit_set: &HashSet<String>,
pick_set: &HashSet<String>,
) -> bool {
if !omit_set.is_empty() && omit_set.contains(field_name) {
return true;
}
if !pick_set.is_empty() && !pick_set.contains(field_name) {
return true;
}
false
}
pub fn should_wrap_in_option(
field_name: &str,
partial_all: bool,
partial_set: &HashSet<String>,
is_already_option: bool,
is_relation: bool,
) -> bool {
(partial_all || partial_set.contains(field_name)) && !is_already_option && !is_relation
}
#[cfg(test)]
mod tests;
#[cfg(test)]
mod schema_type_option_tests;