// main author: Robin Willmann // date : see git. // WIP, changes welcome extern crate image; pub mod model { pub struct Sha256(pub [u8; 64]); pub struct Texture { pub id: String, pub name: String, pub tags: Vec, pub format: TextureFormat, pub resolution: (usize, usize), pub texture_hash: Sha256, } pub enum TextureFormat { PNG, JPG, } } pub mod protocol { use crate::model::*; use std::io; pub enum ReplaceTextureStatus { // Call Again With Texture Binary NeedTextureData, // Done. Ok, } pub type ProtocolResult = Result; pub enum ProtocolError { BadRequest(String), FileNotFound(String), Conflict(String), InternalServerError(std::io::Error), NotImplemented, } pub trait ProtocolHandler: Send + Sync { fn query(&mut self, query: &[String]) -> ProtocolResult>; fn get_texture_by_id(&mut self, id: String) -> ProtocolResult>; fn get_texture_by_name(&mut self, id: String) -> ProtocolResult>; fn get_texture_file(&mut self, hash: Sha256) -> ProtocolResult>; fn get_texture_preview(&mut self, hash: Sha256) -> ProtocolResult>; fn replace_texture( &mut self, delete: Option, insert: Option, insert_texture_data: Option>, ) -> ProtocolResult; } pub struct ProtocolConfig { pub port: u16, } pub fn listen_forever(handler: &ProtocolHandler) -> io::Result<()> { unimplemented!() } } pub mod persistency { use crate::model::*; use std::collections::HashMap; use std::io; use std::path::{Path, PathBuf}; use std::sync::Arc; pub type TextureFileResult = Result< Arc> , TextureFileError> pub enum TextureFileError { NotFound, IOError(io::Error), ImgError(::image::Error), } pub struct DataStore { // private attributes // may change data_dir: PathBuf, texture: Vec, preview_cache: HashMap<(TextureFormat, Sha256), Arc>>, } impl DataStore { pub fn new(path: &Path) -> io::Result { unimplemented!() } pub fn garbage_collect(&mut self) -> io::Result<()> { unimplemented!() } pub fn query(&mut self, query: &self::search::Query) -> Vec { unimplemented!(); // calls self::search::search(... ) } /// returns true if successful pub fn delete(&mut self, tex: &Texture) -> bool { unimplemented!(); } pub fn insert(&mut self, tex: Texture) -> bool { unimplemented!(); } pub fn by_name<'a>(&'a self, name: &str) -> &'a Texture { unimplemented!(); } pub fn by_id<'a, 'b>(&'a self, id: &'b str) -> &'a Texture { unimplemented!(); } pub fn has_hash(&self, hash: &Sha256) -> bool { unimplemented!(); } pub fn get_texture_file(&mut self, hash: &Sha256) -> TextureFileResult { unimplemented!(); } pub fn get_texture_preview(&mut self, hash: &Sha256) -> TextureFileResult { unimplemented!(); } } pub use self::search::Query; mod search { use crate::model::*; pub struct Query { filters: Vec, } pub type QueryParserResult = Result; pub enum QuerySyntaxError { UnknownFilter, } impl Query { pub fn parse(input: &[String]) -> QueryParserResult { unimplemented!() } } pub fn search(input: &[Texture], query: &Query) -> Vec { unimplemented!() } //private enum QueryFilterModifier { None(QueryFilter), Not(QueryFilter), } //private enum QueryFilter { TagName(String), InName(String), MinResolution(usize), BeforeDate { year: u16, month: u16, day: u16 }, } } pub mod image_convert { use crate::model::*; pub struct ConvertConfig { pub desired_size: (usize, usize), } pub fn generate_preview( input: &[u8], format: TextureFormat, config: &ConvertConfig, ) -> ::image::ImageResult> { unimplemented!() } } } pub mod main { use crate::model::*; use crate::protocol::*; use std::sync::Arc; struct ServerState { // private attributes } impl ProtocolHandler for ServerState { fn query(&mut self, query: &[String]) -> ProtocolResult> { unimplemented!() } fn get_texture_by_id(&mut self, id: String) -> ProtocolResult> { unimplemented!() } fn get_texture_by_name(&mut self, id: String) -> ProtocolResult> { unimplemented!() } fn get_texture_file(&mut self, hash: Sha256) -> ProtocolResult>> { unimplemented!() } fn get_texture_preview(&mut self, hash: Sha256) -> ProtocolResult>> { unimplemented!() } fn replace_texture( &mut self, delete: Option, insert: Option, insert_texture_data: Option>, ) -> ProtocolResult { unimplemented!() } } pub fn main() { unimplemented!() } }