indi 5.1.1

Client library for interfacing with the Instrument Neutral Distributed Interface (INDI) protocol.
Documentation
use super::super::*;
use super::*;

impl CommandtoParam for DefLightVector {
    fn get_name(&self) -> &String {
        &self.name
    }
    fn get_group(&self) -> &Option<String> {
        &self.group
    }
    fn to_param(self) -> Parameter {
        Parameter::LightVector(LightVector {
            name: self.name,
            group: self.group,
            label: self.label,
            state: self.state,
            timestamp: self.timestamp.map(Timestamp::into_inner),
            values: self
                .lights
                .into_iter()
                .map(|i| {
                    (
                        i.name,
                        Light {
                            label: i.label,
                            value: i.value,
                        },
                    )
                })
                .collect(),
        })
    }
}

impl CommandToUpdate for SetLightVector {
    fn get_name(&self) -> &String {
        &self.name
    }

    fn update_param(self, param: &mut Parameter) -> Result<String, UpdateError> {
        match param {
            Parameter::LightVector(light_vector) => {
                light_vector.state = self.state;
                light_vector.timestamp = self.timestamp.map(Timestamp::into_inner);
                for light in self.lights {
                    if let Some(existing) = light_vector.values.get_mut(&light.name) {
                        existing.value = light.value;
                    }
                }
                Ok(self.name)
            }
            _ => Err(UpdateError::ParameterTypeMismatch(self.name.clone())),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_parse_light() {
        let xml = r#"
    <defLight name="INDI_DISABLED" label="Disabled">
Ok
    </defLight>
"#;

        let result: DefLight = quick_xml::de::from_str(xml).unwrap();

        assert_eq!(
            result,
            DefLight {
                name: "INDI_DISABLED".to_string(),
                label: Some("Disabled".to_string()),
                value: PropertyState::Ok
            }
        );
    }

    #[test]
    fn test_set_parse_light() {
        let xml = r#"
    <oneLight name="INDI_DISABLED" >
Ok
    </oneLight>
"#;

        let result: OneLight = quick_xml::de::from_str(xml).unwrap();

        assert_eq!(
            result,
            OneLight {
                name: "INDI_DISABLED".to_string(),
                value: PropertyState::Ok
            }
        );
    }

    #[test]
    fn test_def_light_vector() {
        let xml = r#"
    <defLightVector device="CCD Simulator" name="SIMULATE_BAYER" label="Bayer" group="Simulator Config" state="Idle" timestamp="2022-09-06T01:41:22">
    <defLight name="INDI_ENABLED" label="Enabled">
    Busy
    </defLight>
    <defLight name="INDI_DISABLED" label="Disabled">
    Ok
    </defLight>
    </defLightVector>
                    "#;
        let param: DefLightVector = quick_xml::de::from_str(xml).unwrap();

        assert_eq!(param.device, "CCD Simulator");
        assert_eq!(param.name, "SIMULATE_BAYER");
        assert_eq!(param.lights.len(), 2)
    }

    #[test]
    fn test_set_light_vector() {
        let xml = r#"
    <setLightVector device="CCD Simulator" name="SIMULATE_BAYER" state="Idle" timestamp="2022-09-06T01:41:22">
    <oneLight name="INDI_ENABLED">
    Busy
    </oneLight>
    <oneLight name="INDI_DISABLED">
    Ok
    </oneLight>
    </setLightVector>
                    "#;
        let param: SetLightVector = quick_xml::de::from_str(xml).unwrap();

        assert_eq!(param.device, "CCD Simulator");
        assert_eq!(param.name, "SIMULATE_BAYER");
        assert_eq!(param.lights.len(), 2)
    }
}