scout_rs 0.95.95

A Rust client for the synchornizing state with the Scout database
Documentation
use super::v1::Syncable;
use native_db::{native_db, ToKey};
use native_model::{native_model, Model};
use serde::{Deserialize, Serialize};

/// Previous embedded schema (native_model id 20, version 1).
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[native_model(id = 20, version = 1)]
#[native_db]
pub struct SensorPoseLocalV1 {
    pub id: Option<i64>,
    #[primary_key]
    pub id_local: Option<String>,
    #[secondary_key]
    pub part_id: i64,
    pub active_processing_modality: Option<String>,
    pub active_recording_modality: Option<String>,
    pub timestamp_observation: String,
    pub origin_location: Option<String>,
    pub origin_pitch: Option<f64>,
    pub origin_heading: Option<f64>,
    pub origin_roll: Option<f64>,
    pub sensor_pitch: Option<f64>,
    pub sensor_yaw: Option<f64>,
    pub sensor_roll: Option<f64>,
    pub origin_height: Option<f64>,
    pub inserted_at: Option<String>,
}

/// Local (native_db) sensor pose; child of a part. Mirrors the connectivity local model,
/// but linked directly by `part_id` (parts are remote entities, not synced locally).
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[native_model(id = 20, version = 2, from = SensorPoseLocalV1)]
#[native_db]
pub struct SensorPoseLocal {
    pub id: Option<i64>,
    #[primary_key]
    pub id_local: Option<String>,
    #[secondary_key]
    pub part_id: i64,
    pub active_processing_modality: Option<String>,
    pub active_recording_modality: Option<String>,
    pub timestamp_observation: String,
    pub origin_location: Option<String>,
    pub origin_pitch: Option<f64>,
    pub origin_heading: Option<f64>,
    pub origin_roll: Option<f64>,
    pub sensor_pitch: Option<f64>,
    pub sensor_yaw: Option<f64>,
    pub sensor_roll: Option<f64>,
    pub origin_height: Option<f64>,
    pub zoom: Option<f64>,
    pub inserted_at: Option<String>,
}

/// Remote/API sensor pose (`public.sensor_poses`).
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SensorPose {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<i64>,
    pub part_id: i64,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub active_processing_modality: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub active_recording_modality: Option<String>,
    pub timestamp_observation: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub origin_location: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub origin_pitch: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub origin_heading: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub origin_roll: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub sensor_pitch: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub sensor_yaw: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub sensor_roll: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub origin_height: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub zoom: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub inserted_at: Option<String>,
}

impl Syncable for SensorPoseLocal {
    fn id(&self) -> Option<i64> {
        self.id
    }
    fn set_id(&mut self, id: i64) {
        self.id = Some(id);
    }
    fn id_local(&self) -> Option<String> {
        self.id_local.clone()
    }
    fn set_id_local(&mut self, id_local: String) {
        self.id_local = Some(id_local);
    }
}

impl From<SensorPoseLocalV1> for SensorPoseLocal {
    fn from(previous: SensorPoseLocalV1) -> Self {
        Self {
            id: previous.id,
            id_local: previous.id_local,
            part_id: previous.part_id,
            active_processing_modality: previous.active_processing_modality,
            active_recording_modality: previous.active_recording_modality,
            timestamp_observation: previous.timestamp_observation,
            origin_location: previous.origin_location,
            origin_pitch: previous.origin_pitch,
            origin_heading: previous.origin_heading,
            origin_roll: previous.origin_roll,
            sensor_pitch: previous.sensor_pitch,
            sensor_yaw: previous.sensor_yaw,
            sensor_roll: previous.sensor_roll,
            origin_height: previous.origin_height,
            zoom: None,
            inserted_at: previous.inserted_at,
        }
    }
}

impl From<SensorPoseLocal> for SensorPoseLocalV1 {
    fn from(current: SensorPoseLocal) -> Self {
        Self {
            id: current.id,
            id_local: current.id_local,
            part_id: current.part_id,
            active_processing_modality: current.active_processing_modality,
            active_recording_modality: current.active_recording_modality,
            timestamp_observation: current.timestamp_observation,
            origin_location: current.origin_location,
            origin_pitch: current.origin_pitch,
            origin_heading: current.origin_heading,
            origin_roll: current.origin_roll,
            sensor_pitch: current.sensor_pitch,
            sensor_yaw: current.sensor_yaw,
            sensor_roll: current.sensor_roll,
            origin_height: current.origin_height,
            inserted_at: current.inserted_at,
        }
    }
}

impl From<SensorPoseLocal> for SensorPose {
    fn from(local: SensorPoseLocal) -> Self {
        Self {
            id: local.id,
            part_id: local.part_id,
            active_processing_modality: local.active_processing_modality,
            active_recording_modality: local.active_recording_modality,
            timestamp_observation: local.timestamp_observation,
            origin_location: local.origin_location,
            origin_pitch: local.origin_pitch,
            origin_heading: local.origin_heading,
            origin_roll: local.origin_roll,
            sensor_pitch: local.sensor_pitch,
            sensor_yaw: local.sensor_yaw,
            sensor_roll: local.sensor_roll,
            origin_height: local.origin_height,
            zoom: local.zoom,
            inserted_at: local.inserted_at,
        }
    }
}

impl From<SensorPose> for SensorPoseLocal {
    fn from(remote: SensorPose) -> Self {
        Self {
            id: remote.id,
            id_local: None,
            part_id: remote.part_id,
            active_processing_modality: remote.active_processing_modality,
            active_recording_modality: remote.active_recording_modality,
            timestamp_observation: remote.timestamp_observation,
            origin_location: remote.origin_location,
            origin_pitch: remote.origin_pitch,
            origin_heading: remote.origin_heading,
            origin_roll: remote.origin_roll,
            sensor_pitch: remote.sensor_pitch,
            sensor_yaw: remote.sensor_yaw,
            sensor_roll: remote.sensor_roll,
            origin_height: remote.origin_height,
            zoom: remote.zoom,
            inserted_at: remote.inserted_at,
        }
    }
}