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 DefTextVector {
    fn get_name(&self) -> &String {
        &self.name
    }
    fn get_group(&self) -> &Option<String> {
        &self.group
    }
    fn to_param(self) -> Parameter {
        Parameter::TextVector(TextVector {
            name: self.name,
            group: self.group,
            label: self.label,
            state: self.state,
            perm: self.perm,
            timeout: self.timeout,
            timestamp: self.timestamp.map(Timestamp::into_inner),
            values: self
                .texts
                .into_iter()
                .map(|i| {
                    (
                        i.name,
                        Text {
                            label: i.label,
                            value: i.value,
                        },
                    )
                })
                .collect(),
        })
    }
}

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

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

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

    #[test]
    fn test_def_text_vector() {
        let xml = r#"
    <defTextVector device="CCD Simulator" name="ACTIVE_DEVICES" label="Snoop devices" group="Options" state="Idle" perm="rw" timeout="60" timestamp="2022-09-05T21:07:22">
    <defText name="ACTIVE_TELESCOPE" label="Telescope">
    Telescope Simulator
    </defText>
    <defText name="ACTIVE_ROTATOR" label="Rotator">
    Rotator Simulator
    </defText>
    <defText name="ACTIVE_FOCUSER" label="Focuser">
    Focuser Simulator
    </defText>
    <defText name="ACTIVE_FILTER" label="Filter">
    CCD Simulator
    </defText>
    <defText name="ACTIVE_SKYQUALITY" label="Sky Quality">
    SQM
    </defText>
    </defTextVector>
                    "#;
        let command: Result<DefTextVector, _> = quick_xml::de::from_str(xml);

        match command {
            Ok(param) => {
                assert_eq!(param.device, "CCD Simulator");
                assert_eq!(param.name, "ACTIVE_DEVICES");
                assert_eq!(param.texts.len(), 5)
            }
            Err(e) => {
                panic!("Unexpected: {:?}", e)
            }
        }
    }

    #[test]
    fn test_def_text() {
        let xml = r#"
    <defText name="ACTIVE_TELESCOPE" label="Active Telescope">
        Simulator changed
    </defText>
    "#;
        let command: Result<DefText, _> = quick_xml::de::from_str(xml);

        match command {
            Ok(param) => {
                assert_eq!(param.name, "ACTIVE_TELESCOPE");
                assert_eq!(param.label, Some(String::from("Active Telescope")));
                assert_eq!(param.value, "Simulator changed")
            }
            Err(e) => {
                panic!("Unexpected: {:?}", e)
            }
        }
    }

    #[test]
    fn test_one_text() {
        let xml = r#"
    <oneText name="ACTIVE_TELESCOPE">
        Simulator changed
    </oneText>
    "#;
        let command: Result<OneText, _> = quick_xml::de::from_str(xml);

        match command {
            Ok(param) => {
                assert_eq!(param.name, "ACTIVE_TELESCOPE");
                assert_eq!(param.value, "Simulator changed")
            }
            Err(e) => {
                panic!("Unexpected: {:?}", e)
            }
        }
    }
    #[test]
    fn test_set_text_vector() {
        let xml = r#"
    <setTextVector device="CCD Simulator" name="ACTIVE_DEVICES" state="Ok" timeout="60" timestamp="2022-10-01T17:06:14">
    <oneText name="ACTIVE_TELESCOPE">
    Simulator changed
    </oneText>
    <oneText name="ACTIVE_ROTATOR">
    Rotator Simulator
    </oneText>
    <oneText name="ACTIVE_FOCUSER">
    Focuser Simulator
    </oneText>
    <oneText name="ACTIVE_FILTER">
    CCD Simulator
    </oneText>
    <oneText name="ACTIVE_SKYQUALITY">
    SQM
    </oneText>
    </setTextVector>
                    "#;
        let command: Result<SetTextVector, _> = quick_xml::de::from_str(xml);

        match command {
            Ok(param) => {
                assert_eq!(param.device, "CCD Simulator");
                assert_eq!(param.name, "ACTIVE_DEVICES");
                assert_eq!(param.texts.len(), 5)
            }
            Err(e) => {
                panic!("Unexpected: {:?}", e)
            }
        }
    }

    #[test]
    fn test_new_text_vector() {
        let xml = r#"
    <newTextVector device="CCD Simulator" name="ACTIVE_DEVICES" timestamp="2022-10-01T17:06:14">
    <oneText name="ACTIVE_TELESCOPE">
    Simulator changed
    </oneText>
    <oneText name="ACTIVE_ROTATOR">
    Rotator Simulator
    </oneText>
    <oneText name="ACTIVE_FOCUSER">
    Focuser Simulator
    </oneText>
    <oneText name="ACTIVE_FILTER">
    CCD Simulator
    </oneText>
    <oneText name="ACTIVE_SKYQUALITY">
    SQM
    </oneText>
    </newTextVector>
                    "#;
        let command: Result<NewTextVector, _> = quick_xml::de::from_str(xml);
        match command {
            Ok(param) => {
                assert_eq!(param.device, "CCD Simulator");
                assert_eq!(param.name, "ACTIVE_DEVICES");
                assert_eq!(param.texts.len(), 5)
            }
            Err(e) => {
                panic!("Unexpected: {:?}", e)
            }
        }
    }
}