use {
kutil::std::{error::*, *},
std::{convert::*, ffi::*, path::*},
};
#[derive(Clone, Copy, Debug, Default, Display, Eq, FromStr, PartialEq)]
#[display(lowercase)]
#[from_str(lowercase, error = UnknownFormatError)]
pub enum Format {
CBOR,
MessagePack,
#[default]
YAML,
JSON,
#[strings("xjson")]
XJSON,
XML,
}
impl Format {
pub fn is_binary(&self) -> bool {
(*self == Self::CBOR) || (*self == Self::MessagePack)
}
pub fn from_path<PathT>(path: PathT) -> Option<Self>
where
PathT: AsRef<Path>,
{
if let Some(extension) = path.as_ref().extension() {
if extension == OsStr::new("cbor") {
return Some(Self::CBOR);
} else if extension == OsStr::new("mpk") {
return Some(Self::MessagePack);
} else if (extension == OsStr::new("yaml")) || (extension == OsStr::new("yml")) {
return Some(Self::YAML);
} else if extension == OsStr::new("json") {
return Some(Self::JSON);
} else if extension == OsStr::new("xml") {
return Some(Self::XML);
}
}
None
}
pub fn from_extension(extension: &str) -> Option<Self> {
match extension {
"cbor" => Some(Self::CBOR),
"mpk" => Some(Self::MessagePack),
"yaml" | "yml" => Some(Self::YAML),
"json" => Some(Self::JSON),
"xml" => Some(Self::XML),
_ => None,
}
}
}
message_error!(UnknownFormatError, "unknown format");