dnp3 1.6.0

Rust implementation of DNP3 (IEEE 1815) with idiomatic bindings for C, C++, .NET, and Java
Documentation
use crate::app::{file, ObjectParseError, QualifierCode, Variation};
use scursor::ReadCursor;

#[derive(Debug)]
pub(crate) enum FreeFormatVariation<'a> {
    Group70Var2(file::Group70Var2<'a>),
    Group70Var3(file::Group70Var3<'a>),
    Group70Var4(file::Group70Var4<'a>),
    Group70Var5(file::Group70Var5<'a>),
    Group70Var6(file::Group70Var6<'a>),
    Group70Var7(file::Group70Var7<'a>),
    Group70Var8(file::Group70Var8<'a>),
}

impl<'a> FreeFormatVariation<'a> {
    pub(crate) fn parse(
        v: Variation,
        cursor: &mut ReadCursor<'a>,
    ) -> Result<Self, ObjectParseError> {
        let object = match v {
            Variation::Group70Var2 => {
                FreeFormatVariation::Group70Var2(file::Group70Var2::read(cursor)?)
            }
            Variation::Group70Var3 => {
                FreeFormatVariation::Group70Var3(file::Group70Var3::read(cursor)?)
            }
            Variation::Group70Var4 => {
                FreeFormatVariation::Group70Var4(file::Group70Var4::read(cursor)?)
            }
            Variation::Group70Var5 => {
                FreeFormatVariation::Group70Var5(file::Group70Var5::read(cursor)?)
            }
            Variation::Group70Var6 => {
                FreeFormatVariation::Group70Var6(file::Group70Var6::read(cursor)?)
            }
            Variation::Group70Var7 => {
                FreeFormatVariation::Group70Var7(file::Group70Var7::read(cursor)?)
            }
            Variation::Group70Var8 => {
                FreeFormatVariation::Group70Var8(file::Group70Var8::read(cursor)?)
            }
            _ => {
                return Err(ObjectParseError::InvalidQualifierForVariation(
                    v,
                    QualifierCode::FreeFormat16,
                ))
            }
        };

        Ok(object)
    }

    pub(crate) fn format_objects(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        match self {
            FreeFormatVariation::Group70Var2(x) => x.format(f),
            FreeFormatVariation::Group70Var3(x) => x.format(f),
            FreeFormatVariation::Group70Var4(x) => x.format(f),
            FreeFormatVariation::Group70Var5(x) => x.format(f),
            FreeFormatVariation::Group70Var6(x) => x.format(f),
            FreeFormatVariation::Group70Var7(x) => x.format(f),
            FreeFormatVariation::Group70Var8(x) => x.format(f),
        }
    }
}

impl From<file::ReadError> for ObjectParseError {
    fn from(value: file::ReadError) -> Self {
        match value {
            file::ReadError::NoMoreBytes => Self::InsufficientBytes,
            file::ReadError::BadOffset { .. } => Self::BadEncoding,
            file::ReadError::Overflow => Self::BadEncoding,
            file::ReadError::BadString(_) => Self::BadEncoding,
        }
    }
}