From 85b32d5e96cdf345b2553e52c232a46ebc219914 Mon Sep 17 00:00:00 2001 From: shockrah Date: Thu, 30 Sep 2021 19:47:44 -0700 Subject: [PATCH] + Adding last trait methods required for video meta storage to be properly done ! Still need to add file handling however I think I'm going to do that in the trait itself This will probably require some thought so I'm gonna wait until the frontend catches back up --- dblib/src/lib.rs | 17 +++++--- dblib/src/videostore.rs | 89 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 90 insertions(+), 16 deletions(-) diff --git a/dblib/src/lib.rs b/dblib/src/lib.rs index 6f91fc9..8a92e31 100644 --- a/dblib/src/lib.rs +++ b/dblib/src/lib.rs @@ -42,13 +42,15 @@ fn uid() -> std::io::Result { pub struct VideoMeta { pub id: String, pub name: String, - pub desc: Option + pub desc: Option, + pub ext: String, } #[derive(Serialize, Deserialize)] struct VideoMetaEntry { pub name: String, - pub desc: Option + pub desc: Option, + pub ext: String } #[derive(Serialize, Deserialize)] @@ -67,9 +69,12 @@ pub trait KeyStore { } pub trait VideoStore { - fn new_video(name: &str, desc: &str) -> err::Result<()>; + fn new_video(name: &str, desc: &str, ext: &str) -> err::Result<()>; fn del_video(id: String) -> err::Result<()>; - fn get_video(id: Option, name: Option<&str>) -> err::Result; - fn rename_video(id: String, new: &str) -> err::Result<()>; - fn redescribe_video(id: String, new: &str) -> err::Result<()>; + + fn get_video_by_name(name: &str) -> err::Result>; + fn get_video_by_id(id: &str) -> err::Result>; + + fn rename_video(id: String, new: &str) -> err::Result; + fn redescribe_video(id: String, new: &str) -> err::Result; } diff --git a/dblib/src/videostore.rs b/dblib/src/videostore.rs index 692df7f..cf794b0 100644 --- a/dblib/src/videostore.rs +++ b/dblib/src/videostore.rs @@ -4,7 +4,7 @@ use crate::{filename, err, DB, uid}; use crate::{VideoStore, VideoMeta, VideoMetaEntry}; impl VideoStore for DB { - fn new_video(name: &str, desc: &str) -> err::Result<()> { + fn new_video(name: &str, desc: &str, ext: &str) -> err::Result<()> { let fname = filename(); let file = File::open(&fname)?; let reader = BufReader::new(file); @@ -14,14 +14,18 @@ impl VideoStore for DB { let mut data: DB = serde_json::from_reader(reader)?; let entry = VideoMetaEntry { name: name.to_string(), + ext: ext.to_string(), desc: if desc.len() != 0 { None } else { Some(desc.to_string()) } }; // update in mem-cache data.videos.insert(id, entry); - // update the content on disk + + // Update the meta storage let file = File::open(&fname)?; let writer = BufWriter::new(file); serde_json::to_writer(writer, &data)?; + + // TODO: Insert a new file into the data file bucket Ok(()) } fn del_video(id: String) -> err::Result<()> { @@ -29,22 +33,87 @@ impl VideoStore for DB { let file = File::open(&fname)?; let reader = BufReader::new(file); - let mut data: DB = serde_json::from_reader(file)?; - data.videos.remove(id); + let mut data: DB = serde_json::from_reader(reader)?; + data.videos.remove(&id); let file = File::open(&fname)?; let writer = BufWriter::new(file); serde_json::to_writer(writer, &data)?; + Ok(()) } - fn get_video(id: Option, name: Option<&str>) -> err::Result { - todo!() + fn get_video_by_name(name: &str) -> err::Result> { + let fname = filename(); + let file = File::open(&fname)?; + let reader = BufReader::new(file); + + let data: DB = serde_json::from_reader(reader)?; + // TODO: smarter searching using https://www.objc.io/blog/2020/08/18/fuzzy-search/ + let row = data.videos.iter() + .find(|(_, entry)| entry.name.contains(name)); + // >:| + match row { + Some((id, entry)) => { + Ok(Some(VideoMeta { + id: id.to_string(), + name: entry.name.clone(), + desc: entry.desc.clone(), + ext: entry.ext.clone(), + })) + }, + None => Ok(None) + } } - fn rename_video(id: String, new: &str) -> err::Result<()> { - todo!() + fn get_video_by_id(id: &str) -> err::Result> { + let fname = filename(); + let file = File::open(&fname)?; + let reader = BufReader::new(file); + + let data: DB = serde_json::from_reader(reader)?; + match data.videos.get(id) { + Some(entry) => Ok(Some(VideoMeta { + id: id.to_string(), + name: entry.name.clone(), + ext: entry.ext.clone(), + desc: entry.desc.clone() + })), + None => Ok(None) + } } - fn redescribe_video(id: String, new: &str) -> err::Result<()> { - todo!() + + fn rename_video(id: String, new: &str) -> err::Result { + let fname = filename(); + let file = File::open(&fname)?; + let reader = BufReader::new(file); + + let mut data: DB = serde_json::from_reader(reader)?; + match data.videos.get_mut(&id) { + Some(mut entry) => { + entry.name = new.to_string(); + let file = File::open(&fname)?; + let writer = BufWriter::new(file); + serde_json::to_writer(writer, &data)?; + Ok(true) + }, + None => Ok(false) + } + } + fn redescribe_video(id: String, new: &str) -> err::Result { + let fname = filename(); + let file = File::open(&fname)?; + let reader = BufReader::new(file); + + let mut data: DB = serde_json::from_reader(reader)?; + match data.videos.get_mut(&id) { + Some(mut entry) => { + entry.desc = Some(new.to_string()); + let file = File::open(&fname)?; + let writer = BufWriter::new(file); + serde_json::to_writer(writer, &data)?; + Ok(true) + }, + None => Ok(false) + } } }