kcan 0.3.0

CAN controller primitives for actuator and motor control.
Documentation
#![cfg(feature = "serde")]

use serde::{Deserialize, Serialize};

use kcan::{
    ActuatorConfig, ActuatorFeedback, ActuatorHealth, ActuatorMetric, ActuatorProtocol,
    ActuatorSnapshot, CanId, ControlMode, DirectCommand, FaultCode, FeedbackMessageConfig,
    HelperPolicy, KnottDynamicsFault, KnottDynamicsFaults, KnottDynamicsFeedback,
    KnottDynamicsFeedbackKind, KnottDynamicsFlashCommand, KnottDynamicsFunction, KnottDynamicsMode,
    KnottDynamicsModel, KnottDynamicsParameter, KnottDynamicsParameterAccess,
    KnottDynamicsParameterType, KnottDynamicsParameterValue, KnottDynamicsWriteRequirement,
    MitCommand, MitHelperCommand, MotorConfig, MotorFeedback, MotorFeedbackUpdate, MotorModel,
    OriginMode, Position32Feedback, RobStrideCommand, RobStrideFeedback, RobStrideFrameKind,
    RobStrideMitCommand, RobStrideModel, RobStridePositionCommand, RobStrideRawCommand,
    RobStrideSpeedCommand,
};

#[cfg(feature = "tui")]
use kcan::{CanMonitorCommand, TuiCommand, TuiControlIntent, TuiMode, TuiTarget};

#[test]
fn actuator_and_config_types_implement_serde() {
    assert_serde::<CanId>();
    assert_serde::<MotorConfig>();
    assert_serde::<HelperPolicy>();
    assert_serde::<ActuatorProtocol>();
    assert_serde::<ActuatorConfig>();
    assert_serde::<ActuatorFeedback>();
    assert_serde::<ActuatorHealth>();
    assert_serde::<ActuatorMetric>();
    assert_serde::<ActuatorSnapshot>();
}

#[test]
fn cubemars_protocol_types_implement_serde() {
    assert_serde::<MotorModel>();
    assert_serde::<ControlMode>();
    assert_serde::<DirectCommand>();
    assert_serde::<FeedbackMessageConfig>();
    assert_serde::<OriginMode>();
    assert_serde::<MitCommand>();
    assert_serde::<MitHelperCommand>();
    assert_serde::<MotorFeedback>();
    assert_serde::<MotorFeedbackUpdate>();
    assert_serde::<Position32Feedback>();
    assert_serde::<FaultCode>();
}

#[test]
fn robstride_protocol_types_implement_serde() {
    assert_serde::<RobStrideModel>();
    assert_serde::<RobStrideFrameKind>();
    assert_serde::<RobStrideMitCommand>();
    assert_serde::<RobStridePositionCommand>();
    assert_serde::<RobStrideSpeedCommand>();
    assert_serde::<RobStrideRawCommand>();
    assert_serde::<RobStrideCommand>();
    assert_serde::<RobStrideFeedback>();
}

#[test]
fn knott_dynamics_protocol_types_implement_serde() {
    assert_serde::<KnottDynamicsModel>();
    assert_serde::<KnottDynamicsFunction>();
    assert_serde::<KnottDynamicsMode>();
    assert_serde::<KnottDynamicsFault>();
    assert_serde::<KnottDynamicsFaults>();
    assert_serde::<KnottDynamicsParameterType>();
    assert_serde::<KnottDynamicsParameterAccess>();
    assert_serde::<KnottDynamicsParameter>();
    assert_serde::<KnottDynamicsParameterValue>();
    assert_serde::<KnottDynamicsWriteRequirement>();
    assert_serde::<KnottDynamicsFlashCommand>();
    assert_serde::<KnottDynamicsFeedbackKind>();
    assert_serde::<KnottDynamicsFeedback>();
}

#[cfg(feature = "tui")]
#[test]
fn tui_intent_types_implement_serde() {
    assert_serde::<TuiMode>();
    assert_serde::<TuiTarget>();
    assert_serde::<TuiCommand>();
    assert_serde::<TuiControlIntent>();
    assert_serde::<CanMonitorCommand>();
}

fn assert_serde<T>()
where
    T: Serialize + for<'de> Deserialize<'de>,
{
}