use syn::Ident;
use super::HttpStatusValue;
use super::field::FieldDefinition;
use super::field::TransparentFieldDefinition;
use super::format_string::validate_no_optional_fields_in_message;
#[derive(Debug, Clone)]
pub(crate) enum VariantDefinition {
Regular(RegularVariantDefinition),
Transparent(TransparentVariantDefinition),
}
impl VariantDefinition {
pub(crate) fn validate(&self) -> syn::Result<()> {
match self {
Self::Regular(v) => v.validate(),
Self::Transparent(v) => v.validate(),
}
}
}
#[derive(Debug, Clone)]
pub(crate) struct RegularVariantDefinition {
pub(crate) name: Ident,
pub(crate) error_message: String,
pub(crate) diagnostic_code: String,
pub(crate) help_text: Option<String>,
pub(crate) url: Option<String>,
pub(crate) severity: Option<String>,
pub(crate) http_status: Option<HttpStatusValue>,
pub(crate) jsonrpc_code: Option<i32>,
pub(crate) fields: Vec<FieldDefinition>,
}
impl RegularVariantDefinition {
fn validate(&self) -> syn::Result<()> {
if self.error_message.is_empty() {
return Err(syn::Error::new_spanned(
&self.name,
"variant must have #[error(\"message\")] attribute",
));
}
validate_no_optional_fields_in_message(&self.error_message, &self.fields)?;
Ok(())
}
}
#[derive(Debug, Clone)]
pub(crate) struct TransparentVariantDefinition {
pub(crate) name: Ident,
pub(crate) field: TransparentFieldDefinition,
}
impl TransparentVariantDefinition {
fn validate(&self) -> syn::Result<()> {
Ok(())
}
}