use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub enum CoreWrapper {
#[default]
None,
Cow,
Arc,
Bytes,
ArcMutex,
Box,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum DefaultValue {
BoolLiteral(bool),
StringLiteral(String),
IntLiteral(i64),
FloatLiteral(f64),
EnumVariant(String),
TupleVariant(String, Vec<DefaultValue>),
StructVariant(String, Vec<(String, DefaultValue)>),
FunctionCall(String),
PublicFunctionCall(String),
ListLiteral(Vec<DefaultValue>),
Empty,
Unresolved(String),
None,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct ErrorTaxonomy {
#[serde(default)]
pub code: u32,
#[serde(default)]
pub error_type: String,
#[serde(default)]
pub variant: String,
}
impl ErrorTaxonomy {
pub fn for_variant(code: u32, error_type: &str, variant: &str) -> Self {
Self {
code,
error_type: error_type.to_string(),
variant: variant.to_string(),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct DeprecationInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub since: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub note: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct VersionAnnotation {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub since: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub deprecated: Option<DeprecationInfo>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct SerdeContainerConversion {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub from: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub into: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub try_from: Option<String>,
#[serde(default)]
pub transparent: bool,
}
impl SerdeContainerConversion {
pub fn is_present(&self) -> bool {
self.from.is_some() || self.into.is_some() || self.try_from.is_some() || self.transparent
}
}
#[cfg(test)]
mod error_taxonomy_tests {
use super::ErrorTaxonomy;
#[test]
fn explicit_variant_code_is_preserved() {
let taxonomy = ErrorTaxonomy::for_variant(101, "sample::RequestError", "InvalidInput");
assert_eq!(taxonomy.code, 101);
assert_eq!(taxonomy.error_type, "sample::RequestError");
assert_eq!(taxonomy.variant, "InvalidInput");
}
#[test]
fn legacy_serialized_taxonomy_defaults_compatibly() {
let taxonomy: ErrorTaxonomy = serde_json::from_str("{}").expect("legacy metadata deserializes");
assert_eq!(taxonomy, ErrorTaxonomy::default());
}
}