signalk 0.7.0

A library to parse signalk maritime data
Documentation
use serde::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Serialize, Deserialize, PartialEq, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct V1Put {
    pub request_id: String,
    pub context: Option<String>,
    pub put: OptionalArray<V1PutValue>,
}

impl V1Put {
    pub fn builder() -> V1PutBuilder {
        V1PutBuilder::default()
    }
}

#[derive(Default)]
pub struct V1PutBuilder {
    request_id: String,
    context: Option<String>,
    put: OptionalArray<V1PutValue>,
}

impl V1PutBuilder {
    pub fn request_id(mut self, value: String) -> V1PutBuilder {
        self.request_id = value;
        self
    }
    pub fn context(mut self, value: String) -> V1PutBuilder {
        self.context = Some(value);
        self
    }
    pub fn put(mut self, value: V1PutValue) -> V1PutBuilder {
        self.put = OptionalArray::Value(value);
        self
    }
    pub fn build(self) -> V1Put {
        V1Put {
            request_id: self.request_id,
            context: self.context,
            put: self.put,
        }
    }
}

#[derive(Serialize, Deserialize, PartialEq, Debug)]
#[serde(untagged)]
pub enum OptionalArray<T: Default> {
    Value(T),
    Vector(Vec<T>),
}

impl<T: Default> Default for OptionalArray<T> {
    fn default() -> Self {
        Self::Value(T::default())
    }
}

#[derive(Serialize, Deserialize, PartialEq, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct V1PutValue {
    pub path: String,
    pub value: Value,
}

impl V1PutValue {
    pub fn new(path: String, value: Value) -> Self {
        Self { path, value }
    }
}