use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::{EnvPath, raw::EnvPathRaw};
impl Serialize for EnvPath<'_> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
use EnvPathRaw::*;
match &self.raw {
Cow(x) => x.serialize(serializer),
Owned(x) => x.serialize(serializer),
Ref(x) => x.serialize(serializer),
}
}
}
impl<'de> Deserialize<'de> for EnvPath<'_> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let new = EnvPath {
raw: EnvPathRaw::Cow(Vec::deserialize(deserializer)?.into()),
path: None,
}
.de();
Ok(new)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ser_and_deser() -> anyhow::Result<()> {
let p = EnvPath::new(["$env: home", "data", "data"]);
let ron = ron::to_string(&p).unwrap();
let cfg = ron::from_str::<EnvPath>(&ron);
dbg!(&cfg);
Ok(())
}
#[test]
fn deser_ron() {
use serde::{Deserialize, Serialize};
use crate::EnvPath;
#[derive(Serialize, Debug, Deserialize)]
struct Cfg<'a> {
data_dir: Option<EnvPath<'a>>,
}
let str = r#"["$env: xdg_data_home", "$const: os", "$const: pkg"]"#;
let path = ron::from_str::<EnvPath>(str).unwrap();
println!("{}", path.display());
if !path.exists() {
eprintln!("Err: File does not exist")
}
}
#[test]
fn readme_doc_quick_start_0() {
let v =
EnvPath::from(["$dir: data", "$const: pkg", "$env: test_qwq", "app"]).de();
dbg!(v.display(), v.exists());
}
#[test]
fn readme_doc_quick_start_serialisation() {
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(default)]
struct Cfg<'a> {
dir: Option<EnvPath<'a>>,
}
let dir = Some(EnvPath::from(&["$env: user ?? userprofile ?? home"]));
let ron_str = ron::to_string(&Cfg { dir }).expect("Failed to ser");
std::fs::write("test.ron", ron_str)
.expect("Failed to write the ron cfg to test.ron");
}
#[test]
fn readme_doc_quick_start_serialisation_deser() {
use std::fs::File;
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(default)]
struct Cfg<'a> {
dir: Option<EnvPath<'a>>,
}
let cfg: Cfg = ron::de::from_reader(
File::open("test.ron").expect("Failed to open the file: text.ron"),
)
.expect("Failed to deser ron cfg");
if let Some(x) = &cfg.dir {
if x.exists() {
println!("{}", x.display())
}
}
dbg!(&cfg);
}
}