+ 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
This commit is contained in:
parent
678dd3d7ee
commit
85b32d5e96
@ -42,13 +42,15 @@ fn uid() -> std::io::Result<String> {
|
||||
pub struct VideoMeta {
|
||||
pub id: String,
|
||||
pub name: String,
|
||||
pub desc: Option<String>
|
||||
pub desc: Option<String>,
|
||||
pub ext: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
struct VideoMetaEntry {
|
||||
pub name: String,
|
||||
pub desc: Option<String>
|
||||
pub desc: Option<String>,
|
||||
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<String>, name: Option<&str>) -> err::Result<VideoMeta>;
|
||||
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<Option<VideoMeta>>;
|
||||
fn get_video_by_id(id: &str) -> err::Result<Option<VideoMeta>>;
|
||||
|
||||
fn rename_video(id: String, new: &str) -> err::Result<bool>;
|
||||
fn redescribe_video(id: String, new: &str) -> err::Result<bool>;
|
||||
}
|
||||
|
@ -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<String>, name: Option<&str>) -> err::Result<VideoMeta> {
|
||||
todo!()
|
||||
fn get_video_by_name(name: &str) -> err::Result<Option<VideoMeta>> {
|
||||
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<Option<VideoMeta>> {
|
||||
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<bool> {
|
||||
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<bool> {
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user