use std::fmt;
use serde::Deserialize;
#[derive(Clone, Debug, Deserialize)]
pub struct ModelFile {
pub rfilename: String,
pub size: Option<i64>,
pub oid: Option<String>,
}
impl ModelFile {
pub fn new(rfilename: String, size: Option<i64>, oid: Option<String>) -> Self {
Self {
rfilename,
size,
oid,
}
}
pub fn get_rfilename(&self) -> &'_ String {
&self.rfilename
}
pub fn get_size(&self) -> Option<i64> {
self.size
}
pub fn get_oid(&self) -> Option<&'_ String> {
self.oid.as_ref()
}
}
impl PartialEq for ModelFile {
fn eq(&self, other: &Self) -> bool {
self.rfilename == other.rfilename && self.size == other.size && self.oid == other.oid
}
}
impl fmt::Display for ModelFile {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Model File: {:?}", self.rfilename)?;
if let Some(size) = &self.size {
write!(f, ", Size: {:?}", size)?;
}
if let Some(oid) = &self.oid {
write!(f, ", OID: {:?}", oid)?;
}
Ok(())
}
}
impl From<serde_json::Value> for ModelFile {
fn from(response_json: serde_json::Value) -> Self {
ModelFile::new(
response_json["rfilename"]
.as_str()
.map(|s| s.to_string())
.unwrap_or_default(),
serde_json::from_value(response_json["size"].clone()).unwrap_or_default(),
serde_json::from_value(response_json["oid"].clone()).unwrap_or_default(),
)
}
}
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
use serde_json::json;
#[test]
fn test_modelfile_impl() {
let rfilename = "rfilename".to_string();
let size = Some(1);
let oid = Some("oid".to_string());
let modelfile = ModelFile::new(rfilename.clone(), size, oid.clone());
assert_eq!(modelfile.rfilename, rfilename);
assert_eq!(modelfile.size, size);
assert_eq!(modelfile.oid, oid);
assert_eq!(modelfile.get_rfilename(), &rfilename);
assert_eq!(modelfile.get_size(), size);
}
#[test]
fn test_modelfile_partial_eq() {
let rfilename = "rfilename".to_string();
let size = Some(1);
let oid = Some("oid".to_string());
let modelfile = ModelFile::new(rfilename.clone(), size, oid.clone());
let modelfile2 = ModelFile::new(rfilename, size, oid);
assert_eq!(modelfile, modelfile2);
}
#[test]
fn test_modelfile_display() {
let rfilename = "rfilename".to_string();
let size = Some(1);
let oid = Some("oid".to_string());
let modelfile = ModelFile::new(rfilename, size, oid);
assert_eq!(
format!(
"Model File: {:?}, Size: {:?}, OID: {:?}",
"rfilename", 1, "oid"
),
format!("{}", modelfile)
);
}
#[test]
fn test_modelfile_from_value() {
let rfilename = "rfilename".to_string();
let size = Some(1);
let oid = Some("oid".to_string());
let response_json = json!({
"rfilename": rfilename,
"size": size.clone(),
"oid": oid,
});
let modelfile = ModelFile::from(response_json);
assert_eq!(modelfile.rfilename, rfilename);
assert_eq!(modelfile.size, size);
assert_eq!(modelfile.oid, oid);
}
}