protto_derive 0.6.1

Automatically derive Protobuf and Rust conversions.
Documentation
use crate::analysis::attribute_parser;
use crate::constants;
use crate::debug::CallStackDebug;
use syn::{Field, Meta};

#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Hash)]
pub enum ExpectMode {
    #[default]
    None,
    Error,
    Panic,
}

impl ExpectMode {
    pub fn from_field_meta(
        field: &Field,
        proto_meta: &attribute_parser::ProtoFieldMeta,
    ) -> ExpectMode {
        let _trace = CallStackDebug::new(
            "expect_analysis::ExpectMode",
            "from_field_meta",
            "",
            field
                .ident
                .as_ref()
                .map(|f| f.to_string())
                .unwrap_or_default(),
        );

        let expect_panic = has_expect_panic_syntax(field);
        _trace.checkpoint_data(
            "determine_expect_mode",
            &[
                ("expect_panic", &expect_panic.to_string()),
                ("proto_meta.expect", &proto_meta.expect.to_string()),
            ],
        );

        if expect_panic {
            ExpectMode::Panic
        } else if proto_meta.expect {
            ExpectMode::Error
        } else {
            ExpectMode::None
        }
    }
}

pub fn has_expect_panic_syntax(field: &Field) -> bool {
    for attr in &field.attrs {
        if attr.path().is_ident(constants::PROTTO_ATTRIBUTE)
            && let Meta::List(meta_list) = &attr.meta
        {
            let tokens_str = meta_list.tokens.to_string();
            if tokens_str.replace(" ", "").contains("expect(panic)") {
                return true;
            }
        }
    }
    false
}