use crate::{Dictionary, FixDatatype, FixmlComponentAttributes};
use smallvec::SmallVec;
use smartstring::alias::String as SmartString;
pub struct DictionaryBuilder {
dict: Dictionary,
}
impl DictionaryBuilder {
pub fn new(dict: Dictionary) -> Self {
DictionaryBuilder { dict }
}
pub fn dict(&self) -> &Dictionary {
&self.dict
}
pub fn build(self) -> Dictionary {
self.dict
}
pub fn add_field(&mut self, field: FieldData) {
self.dict
.field_tags_by_name
.insert(field.name.clone(), field.tag);
self.dict.fields_by_tags.insert(field.tag, field);
}
pub fn add_message(&mut self, message: MessageData) {
self.dict
.message_msgtypes_by_name
.insert(message.name.clone(), message.msg_type.clone());
self.dict
.messages_by_msgtype
.insert(message.msg_type.clone(), message);
}
pub fn add_component(&mut self, component: ComponentData) {
self.dict
.components_by_name
.insert(component.name.clone(), component);
}
pub fn add_datatype(&mut self, datatype: DatatypeData) {
self.dict
.data_types_by_name
.insert(datatype.datatype.name().into(), datatype);
}
pub fn add_category(&mut self, category: CategoryData) {
self.dict
.categories_by_name
.insert(category.name.clone().into(), category);
}
}
#[derive(Clone, Debug)]
pub struct FieldData {
pub name: SmartString,
pub tag: u32,
pub data_type_name: SmartString,
pub associated_data_tag: Option<usize>,
pub value_restrictions: Option<SmallVec<[FieldEnumData; 16]>>,
pub abbr_name: Option<String>,
pub base_category_id: Option<usize>,
pub base_category_abbr_name: Option<String>,
pub required: bool,
pub description: Option<String>,
}
#[derive(Clone, Debug)]
pub struct CategoryData {
pub name: String,
pub fixml_filename: String,
}
#[derive(Clone, Debug, PartialEq)]
pub struct DatatypeData {
pub datatype: FixDatatype,
pub description: String,
pub examples: SmallVec<[String; 4]>,
}
#[derive(Clone, Debug)]
pub struct AbbreviationData {
pub abbreviation: SmartString,
pub is_last: bool,
}
#[derive(Clone, Debug)]
pub struct ComponentData {
pub id: usize,
pub component_type: FixmlComponentAttributes,
pub layout_items: Vec<LayoutItemData>,
pub category_name: SmartString,
pub name: SmartString,
pub abbr_name: Option<SmartString>,
}
#[derive(Clone, Debug)]
#[allow(dead_code)]
pub enum LayoutItemKindData {
Component {
name: SmartString,
},
Group {
len_field_tag: u32,
items: Vec<LayoutItemData>,
},
Field {
tag: u32,
},
}
#[derive(Clone, Debug)]
pub struct LayoutItemData {
pub required: bool,
pub kind: LayoutItemKindData,
}
#[derive(Clone, Debug)]
pub struct MessageData {
pub component_id: u32,
pub msg_type: SmartString,
pub name: SmartString,
pub category_name: SmartString,
pub section_id: String,
pub layout_items: Vec<LayoutItemData>,
pub abbr_name: Option<SmartString>,
pub required: bool,
pub description: String,
pub elaboration: Option<String>,
}
#[derive(Clone, Debug)]
pub struct FieldEnumData {
pub value: String,
pub description: String,
}