use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
use std::ffi::CString;
#[allow(dead_code)]
pub mod opt_cstr {
use super::*;
pub fn serialize<S: Serializer>(c: &Option<CString>, s: S) -> Result<S::Ok, S::Error> {
match c {
Some(v) => s.serialize_some(v.to_str().map_err(serde::ser::Error::custom)?),
None => s.serialize_none(),
}
}
pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Option<CString>, D::Error> {
match Option::<String>::deserialize(d)? {
Some(v) => CString::new(v).map(Some).map_err(de::Error::custom),
None => Ok(None),
}
}
}
pub mod kv_pairs {
use super::*;
pub fn serialize<S: Serializer>(v: &[(CString, CString)], s: S) -> Result<S::Ok, S::Error> {
let mapped: Vec<(&str, &str)> = v
.iter()
.map(|(k, val)| {
Ok((
k.to_str().map_err(serde::ser::Error::custom)?,
val.to_str().map_err(serde::ser::Error::custom)?,
))
})
.collect::<Result<_, S::Error>>()?;
mapped.serialize(s)
}
pub fn deserialize<'de, D: Deserializer<'de>>(
d: D,
) -> Result<Vec<(CString, CString)>, D::Error> {
<Vec<(String, String)> as Deserialize>::deserialize(d)?
.into_iter()
.map(|(k, v)| CString::new(k).and_then(|k| CString::new(v).map(|v| (k, v))))
.collect::<Result<_, _>>()
.map_err(de::Error::custom)
}
}
pub mod kv_i64_pairs {
use super::*;
pub fn serialize<S: Serializer>(v: &[(CString, i64)], s: S) -> Result<S::Ok, S::Error> {
let mapped: Vec<(&str, i64)> = v
.iter()
.map(|(k, val)| Ok((k.to_str().map_err(serde::ser::Error::custom)?, *val)))
.collect::<Result<_, S::Error>>()?;
mapped.serialize(s)
}
pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Vec<(CString, i64)>, D::Error> {
<Vec<(String, i64)> as Deserialize>::deserialize(d)?
.into_iter()
.map(|(k, v)| CString::new(k).map(|k| (k, v)))
.collect::<Result<_, _>>()
.map_err(de::Error::custom)
}
}
pub mod graph_opt {
use super::*;
use crate::sys::GraphOptimizationLevel;
pub fn serialize<S: Serializer>(v: &GraphOptimizationLevel, s: S) -> Result<S::Ok, S::Error> {
s.serialize_i32(*v as i32)
}
pub fn deserialize<'de, D: Deserializer<'de>>(
d: D,
) -> Result<GraphOptimizationLevel, D::Error> {
Ok(match i32::deserialize(d)? {
0 => GraphOptimizationLevel::DisableAll,
1 => GraphOptimizationLevel::Basic,
2 => GraphOptimizationLevel::Extended,
3 => GraphOptimizationLevel::Layout,
99 => GraphOptimizationLevel::All,
i => {
return Err(de::Error::custom(format!(
"unknown GraphOptimizationLevel discriminant: {i}"
)))
},
})
}
}