use crate::ir::{ByteOrder, Ir};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Schema {
pub package: String,
pub id: u16,
pub version: u16,
pub ir: Ir,
}
impl Schema {
#[must_use]
pub(crate) fn new(package: impl Into<String>, id: u16, version: u16) -> Self {
let package_str = package.into();
Self {
package: package_str.clone(),
id,
version,
ir: Ir {
package: package_str,
id,
version,
byte_order: ByteOrder::LittleEndian,
description: None,
semantic_version: None,
header_type: "messageHeader".to_string(),
tokens: Vec::new(),
},
}
}
#[must_use]
pub fn from_ir(ir: Ir) -> Self {
Self {
package: ir.package.clone(),
id: ir.id,
version: ir.version,
ir,
}
}
}
#[cfg(test)]
mod tests {
use super::Schema;
#[test]
fn schema_metadata_preserves_identity_fields() -> Result<(), Box<dyn std::error::Error>> {
let schema = Schema::new("fix.sbe", 42, 7);
assert_eq!(schema.package, "fix.sbe");
assert_eq!(schema.id, 42);
assert_eq!(schema.version, 7);
Ok(())
}
#[test]
fn schema_from_ir_preserves_metadata() -> Result<(), Box<dyn std::error::Error>> {
use crate::ir::{ByteOrder, Ir};
let ir = Ir {
package: "test_pkg".to_string(),
id: 99,
version: 3,
byte_order: ByteOrder::BigEndian,
description: Some("test".to_string()),
semantic_version: Some("1.0".to_string()),
header_type: "customHeader".to_string(),
tokens: Vec::new(),
};
let schema = Schema::from_ir(ir);
assert_eq!(schema.package, "test_pkg");
assert_eq!(schema.id, 99);
assert_eq!(schema.version, 3);
assert_eq!(schema.ir.header_type, "customHeader");
Ok(())
}
#[test]
fn schema_new_has_correct_ir_defaults() -> Result<(), Box<dyn std::error::Error>> {
use crate::ir::ByteOrder;
let schema = Schema::new("pkg", 1, 0);
assert_eq!(schema.ir.package, "pkg");
assert_eq!(schema.ir.id, 1);
assert_eq!(schema.ir.version, 0);
assert_eq!(schema.ir.byte_order, ByteOrder::LittleEndian);
assert!(schema.ir.description.is_none());
assert!(schema.ir.semantic_version.is_none());
assert_eq!(schema.ir.header_type, "messageHeader");
assert!(schema.ir.tokens.is_empty());
Ok(())
}
}