#![warn(missing_docs)]
use std::borrow::Cow;
pub const DFDL_NAMESPACE: &str = r"http://www.ogf.org/dfdl/dfdl-1.0/";
pub const DFDL_ANNOTATION_SOURCE: &str = r"http://www.ogf.org/dfdl/";
pub const XSD_NAMESPACE: &str = r"http://www.w3.org/2001/XMLSchema";
#[cfg(feature = "serde")]
pub mod serde;
#[derive(Clone, Debug)]
pub struct Infoset<'i> {
dfdl_version: String,
root_element: Option<Element<'i>>
}
impl Infoset<'_> {
#[must_use]
pub fn version(&self) -> &str {
&self.dfdl_version
}
pub fn into_owned(self) -> Infoset<'static> {
Infoset { dfdl_version: self.dfdl_version, root_element: self.root_element.map(Element::into_owned) }
}
}
#[derive(Clone, Debug)]
enum Element<'e> {
SimpleElement(SimpleElement<'e>),
ComplexElement(ComplexElement<'e>),
}
impl Element<'_> {
fn is_some(&self) -> bool {
match self {
Self::SimpleElement(SimpleElement { nilled, .. }) |
Self::ComplexElement(ComplexElement { nilled, .. }) => !nilled,
}
}
fn name(&self) -> &str {
match self {
Self::SimpleElement(SimpleElement {name, ..}) |
Self::ComplexElement(ComplexElement {name, ..}) => name,
}
}
fn is_array(&self) -> bool {
match self {
Self::SimpleElement(SimpleElement {array, ..}) |
Self::ComplexElement(ComplexElement {array, ..}) => *array,
}
}
fn typename(&self) -> &str {
match self {
Element::SimpleElement(SimpleElement {data: Some(data), ..}) => data.typename(),
Element::SimpleElement(SimpleElement {data: None, ..}) => todo!(),
Element::ComplexElement(_complex_element) => "",
}
}
fn into_owned(self) -> Element<'static> {
match self {
Element::SimpleElement(simple_element) => Element::SimpleElement(simple_element.into_owned()),
Element::ComplexElement(complex_element) => Element::ComplexElement(complex_element.into_owned()),
}
}
}
#[derive(Clone, Debug)]
struct SimpleElement<'e> {
schema: String,
namespace: String,
name: String,
nilled: bool,
array: bool,
valid: bool,
union_member_schema: String,
data: Option<Data<'e>>,
}
impl SimpleElement<'_> {
fn into_owned(self) -> SimpleElement<'static> {
SimpleElement {
schema: self.schema,
namespace: self.namespace,
name: self.name,
nilled: self.nilled,
array: self.array,
valid: self.valid,
union_member_schema: self.union_member_schema,
data: self.data.map(Data::into_owned),
}
}
}
#[derive(Clone, Debug)]
enum Data<'d> {
Double(f64),
Float(f32),
Decimal(),
Integer(i32), NonNegativeInteger(u32), Long(i64),
Int(i32),
Short(i16),
Byte(i8),
UnsignedLong(u64),
UnsignedInt(u32),
UnsignedShort(u16),
UnsignedByte(u8),
String(Cow<'d, str>),
DateTime,
Date,
Time,
HexBinary(Cow<'d, [u8]>),
Boolean(bool),
}
impl Data<'_> {
fn typename(&self) -> &'static str {
match self {
Data::Double(_) => "f64",
Data::Float(_) => "f32",
Data::Decimal() => "decimal",
Data::Integer(_) => "integer",
Data::NonNegativeInteger(_) => "unsigned",
Data::Long(_) => "i64",
Data::Int(_) => "i32",
Data::Short(_) => "i16",
Data::Byte(_) => "i8",
Data::UnsignedLong(_) => "u64",
Data::UnsignedInt(_) => "u32",
Data::UnsignedShort(_) => "u16",
Data::UnsignedByte(_) => "u8",
Data::String(_) => "string",
Data::DateTime => "datetime",
Data::Date => "date",
Data::Time => "time",
Data::HexBinary(_) => "hexnumber",
Data::Boolean(_) => "bool",
}
}
fn into_owned(self) -> Data<'static> {
match self {
Data::Double(data) => Data::Double(data),
Data::Float(data) => Data::Float(data),
Data::Decimal() => Data::Decimal(),
Data::Integer(data) => Data::Integer(data),
Data::NonNegativeInteger(data) => Data::NonNegativeInteger(data),
Data::Long(data) => Data::Long(data),
Data::Int(data) => Data::Int(data),
Data::Short(data) => Data::Short(data),
Data::Byte(data) => Data::Byte(data),
Data::UnsignedLong(data) => Data::UnsignedLong(data),
Data::UnsignedInt(data) => Data::UnsignedInt(data),
Data::UnsignedShort(data) => Data::UnsignedShort(data),
Data::UnsignedByte(data) => Data::UnsignedByte(data),
Data::String(cow) => Data::String(Cow::Owned(cow.into_owned())),
Data::DateTime => Data::DateTime,
Data::Date => Data::Date,
Data::Time => Data::Time,
Data::HexBinary(cow) => Data::HexBinary(Cow::Owned(cow.into_owned())),
Data::Boolean(data) => Data::Boolean(data),
}
}
}
#[derive(Clone, Debug)]
struct ComplexElement<'e> {
#[allow(dead_code)]
schema: String,
#[allow(dead_code)]
namespace: String,
name: String,
nilled: bool,
array: bool,
#[allow(dead_code)]
valid: bool,
#[allow(dead_code)]
union_member_schema: String,
children: Vec<Element<'e>>,
}
impl ComplexElement<'_> {
fn into_owned(self) -> ComplexElement<'static> {
let children = self.children.into_iter().map(Element::into_owned).collect();
ComplexElement {
schema: self.schema,
namespace: self.namespace,
name: self.name,
nilled: self.nilled,
array: self.array,
valid: self.valid,
union_member_schema: self.union_member_schema,
children,
}
}
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
}
}