replman_derive_impl 0.1.0

An opinionated REPL framework
Documentation
use std::fmt;

use convert_case::Casing;
use syn::{LitStr, Variant};

use crate::enum_attributes::EnumAttributes;
use crate::variant_attributes::VariantAttributes;

pub struct EffectiveVariantName {
    pub main_name: LitStr,
    pub aliases: Vec<LitStr>,
}

impl fmt::Display for EffectiveVariantName {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.main_name.value())?;
        for alias in &self.aliases {
            write!(f, "|{}", alias.value())?;
        }

        Ok(())
    }
}

pub fn effective_variant_name(
    variant: &Variant,
    enum_attrs: &EnumAttributes,
    variant_attrs: &VariantAttributes,
) -> EffectiveVariantName {
    let variant_name = &variant.ident;
    let mut main_name = variant_name.to_string();
    if let Some(rename_all) = enum_attrs.rename_all.as_ref() {
        main_name = main_name.to_case(*rename_all);
    }

    let main_name = LitStr::new(&main_name, variant.ident.span());

    EffectiveVariantName {
        main_name,
        aliases: variant_attrs.aliases.clone(),
    }
}