dnp3 1.6.0

Rust implementation of DNP3 (IEEE 1815) with idiomatic bindings for C, C++, .NET, and Java
Documentation
use std::fmt::Display;

use crate::app::variations::Variation;
use crate::app::QualifierCode;

use scursor::*;

pub(crate) trait FixedSize: Copy + Clone
where
    Self: Sized,
{
    const SIZE: u8;

    fn read(cursor: &mut ReadCursor) -> Result<Self, ReadError>;
    fn write(&self, cursor: &mut WriteCursor) -> Result<(), WriteError>;
}

pub(crate) trait Index: Copy + Clone + FixedSize + PartialEq + Display {
    fn zero() -> Self;
    fn next(self) -> Self;
    fn widen_to_u16(self) -> u16;

    fn one() -> Self {
        Self::zero().next()
    }

    fn increment(&mut self) {
        *self = self.next()
    }

    const COUNT_AND_PREFIX_QUALIFIER: QualifierCode;
    const RANGE_QUALIFIER: QualifierCode;
    const LIMITED_COUNT_QUALIFIER: QualifierCode;
}

pub(crate) trait FixedSizeVariation: FixedSize + PartialEq + Display {
    const VARIATION: Variation;
}

impl FixedSize for u8 {
    const SIZE: u8 = 1;

    fn read(cursor: &mut ReadCursor) -> Result<Self, ReadError> {
        cursor.read_u8()
    }
    fn write(&self, cursor: &mut WriteCursor) -> Result<(), WriteError> {
        cursor.write_u8(*self)
    }
}

impl FixedSize for u16 {
    const SIZE: u8 = 2;
    fn read(cursor: &mut ReadCursor) -> Result<Self, ReadError> {
        cursor.read_u16_le()
    }
    fn write(&self, cursor: &mut WriteCursor) -> Result<(), WriteError> {
        cursor.write_u16_le(*self)
    }
}

impl Index for u8 {
    fn zero() -> Self {
        0
    }
    fn next(self) -> Self {
        self + 1
    }
    fn widen_to_u16(self) -> u16 {
        self as u16
    }

    const COUNT_AND_PREFIX_QUALIFIER: QualifierCode = QualifierCode::CountAndPrefix8;
    const RANGE_QUALIFIER: QualifierCode = QualifierCode::Range8;
    const LIMITED_COUNT_QUALIFIER: QualifierCode = QualifierCode::Count8;
}

impl Index for u16 {
    fn zero() -> Self {
        0
    }
    fn next(self) -> Self {
        self + 1
    }
    fn widen_to_u16(self) -> u16 {
        self
    }

    const COUNT_AND_PREFIX_QUALIFIER: QualifierCode = QualifierCode::CountAndPrefix16;
    const RANGE_QUALIFIER: QualifierCode = QualifierCode::Range16;
    const LIMITED_COUNT_QUALIFIER: QualifierCode = QualifierCode::Count16;
}