use crate::Error;
use serde::{Deserialize, Serialize};
use serde_ini::{Serializer, Writer};
use std::io::{Read, Write};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Properties {
#[serde(skip_serializing_if = "Option::is_none")]
core: Option<CoreProperties>,
#[serde(skip_serializing_if = "Option::is_none")]
compute: Option<ComputeProperties>,
}
impl Properties {
pub fn from_reader<R: Read>(reader: R) -> Result<Self, Error> {
let properties = serde_ini::de::from_read(reader)?;
Ok(properties)
}
pub fn to_writer<W: Write>(&self, writer: W) -> Result<(), Error> {
let mut ser = Serializer::new(Writer::new(writer, serde_ini::LineEnding::Linefeed));
self.serialize(&mut ser)?;
Ok(())
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
struct CoreProperties {
#[serde(skip_serializing_if = "Option::is_none")]
project: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
account: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
struct ComputeProperties {
#[serde(skip_serializing_if = "Option::is_none")]
zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
region: Option<String>,
}
#[derive(Debug, Default)]
pub struct PropertiesBuilder {
project: Option<String>,
account: Option<String>,
zone: Option<String>,
region: Option<String>,
}
impl PropertiesBuilder {
pub fn build(&self) -> Properties {
let core = if self.project.is_some() || self.account.is_some() {
Some(CoreProperties {
project: self.project.clone(),
account: self.account.clone(),
})
} else {
None
};
let compute = if self.zone.is_some() || self.region.is_some() {
Some(ComputeProperties {
zone: self.zone.clone(),
region: self.region.clone(),
})
} else {
None
};
Properties { core, compute }
}
pub fn project(&mut self, project: &str) -> &mut Self {
self.project = Some(project.to_owned());
self
}
pub fn account(&mut self, account: &str) -> &mut Self {
self.account = Some(account.to_owned());
self
}
pub fn zone(&mut self, zone: &str) -> &mut Self {
self.zone = Some(zone.to_owned());
self
}
pub fn region(&mut self, region: &str) -> &mut Self {
self.region = Some(region.to_owned());
self
}
}