create skeleton for server from design

This commit is contained in:
CodeSteak 2019-04-20 01:24:19 +02:00
parent 6f86302e06
commit 88fae2cba4
10 changed files with 277 additions and 245 deletions

View File

@ -1,245 +0,0 @@
// 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<String>,
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<T> = Result<T, ProtocolError>;
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<Vec<Texture>>;
fn get_texture_by_id(&mut self, id: String) -> ProtocolResult<Option<Texture>>;
fn get_texture_by_name(&mut self, id: String) -> ProtocolResult<Option<Texture>>;
fn get_texture_file(&mut self, hash: Sha256) -> ProtocolResult<Vec<u8>>;
fn get_texture_preview(&mut self, hash: Sha256) -> ProtocolResult<Vec<u8>>;
fn replace_texture(
&mut self,
delete: Option<Texture>,
insert: Option<Texture>,
insert_texture_data: Option<Vec<u8>>,
) -> ProtocolResult<ReplaceTextureStatus>;
}
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<Vec<u8>> , TextureFileError>
pub enum TextureFileError {
NotFound,
IOError(io::Error),
ImgError(::image::Error),
}
pub struct DataStore {
// private attributes
// may change
data_dir: PathBuf,
texture: Vec<Texture>,
preview_cache: HashMap<(TextureFormat, Sha256), Arc<Vec<u8>>>,
}
impl DataStore {
pub fn new(path: &Path) -> io::Result<DataStore> {
unimplemented!()
}
pub fn garbage_collect(&mut self) -> io::Result<()> {
unimplemented!()
}
pub fn query(&mut self, query: &self::search::Query) -> Vec<Texture> {
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<QueryFilterModifier>,
}
pub type QueryParserResult = Result<Query, QuerySyntaxError>;
pub enum QuerySyntaxError {
UnknownFilter,
}
impl Query {
pub fn parse(input: &[String]) -> QueryParserResult {
unimplemented!()
}
}
pub fn search(input: &[Texture], query: &Query) -> Vec<Texture> {
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<Vec<u8>> {
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<Vec<Texture>> {
unimplemented!()
}
fn get_texture_by_id(&mut self, id: String) -> ProtocolResult<Option<Texture>> {
unimplemented!()
}
fn get_texture_by_name(&mut self, id: String) -> ProtocolResult<Option<Texture>> {
unimplemented!()
}
fn get_texture_file(&mut self, hash: Sha256) -> ProtocolResult<Arc<Vec<u8>>> {
unimplemented!()
}
fn get_texture_preview(&mut self, hash: Sha256) -> ProtocolResult<Arc<Vec<u8>>> {
unimplemented!()
}
fn replace_texture(
&mut self,
delete: Option<Texture>,
insert: Option<Texture>,
insert_texture_data: Option<Vec<u8>>,
) -> ProtocolResult<ReplaceTextureStatus> {
unimplemented!()
}
}
pub fn main() {
unimplemented!()
}
}

View File

View File

@ -0,0 +1,10 @@
[package]
name = "texture-sync-server"
version = "0.1.0"
authors = ["CodeSteak <codesteak@shellf.art>"]
edition = "2018"
[dependencies]
image = "0.21.1"
serde = "1.0.90"
serde_json = "1.0.39"

View File

@ -0,0 +1,19 @@
// TODO: remove on implementation
#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(dead_code)]
extern crate serde_json;
extern crate serde;
extern crate image;
pub mod model;
pub mod persistency;
pub mod protocol;
mod server_state;
use server_state::*;
fn main() {
println!("Hello, world!");
}

View File

@ -0,0 +1,20 @@
// TODO: remove on implementation
#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(dead_code)]
pub struct Sha256(pub [u8; 64]);
pub struct Texture {
pub id: String,
pub name: String,
pub tags: Vec<String>,
pub format: TextureFormat,
pub resolution: (usize, usize),
pub texture_hash: Sha256,
}
pub enum TextureFormat {
PNG,
JPEG,
}

View File

@ -0,0 +1,19 @@
// TODO: remove on implementation
#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(dead_code)]
use crate::model::*;
pub struct ConvertConfig {
pub desired_size: (usize, usize),
}
pub fn generate_preview(
input: &[u8],
format: TextureFormat,
config: &ConvertConfig,
) -> ::image::ImageResult<Vec<u8>> {
unimplemented!()
}

View File

@ -0,0 +1,75 @@
// TODO: remove on implementation
#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(dead_code)]
use crate::model::*;
use std::collections::HashMap;
use std::io;
use std::path::{Path, PathBuf};
use std::sync::Arc;
pub use self::search::Query;
mod search;
mod image_convert;
pub type TextureFileResult = Result< Arc<Vec<u8>> , TextureFileError>;
pub enum TextureFileError {
NotFound,
IoError(io::Error),
ImageError(::image::ImageError),
}
pub struct DataStore {
// private attributes
// may change
data_dir: PathBuf,
texture: Vec<Texture>,
preview_cache: HashMap<(TextureFormat, Sha256), Arc<Vec<u8>>>,
}
impl DataStore {
pub fn new(path: &Path) -> io::Result<DataStore> {
unimplemented!()
}
pub fn garbage_collect(&mut self) -> io::Result<()> {
unimplemented!()
}
pub fn query(&mut self, query: &self::search::Query) -> Vec<Texture> {
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) -> Option<&'a Texture> {
unimplemented!();
}
pub fn by_id<'a, 'b>(&'a self, id: &'b str) -> Option<&'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!();
}
}

View File

@ -0,0 +1,38 @@
// TODO: remove on implementation
#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(dead_code)]
use crate::model::*;
pub struct Query {
filters: Vec<QueryFilterModifier>,
}
pub type QueryParserResult = Result<Query, QuerySyntaxError>;
pub enum QuerySyntaxError {
UnknownFilter,
}
impl Query {
pub fn parse(input: &[String]) -> QueryParserResult {
unimplemented!()
}
}
pub fn search(input: &[Texture], query: &Query) -> Vec<Texture> {
unimplemented!()
}
enum QueryFilterModifier {
None(QueryFilter),
Not(QueryFilter),
}
enum QueryFilter {
TagName(String),
InName(String),
MinResolution(usize),
BeforeDate { year: u16, month: u16, day: u16 },
}

View File

@ -0,0 +1,52 @@
// TODO: remove on implementation
#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(dead_code)]
use crate::model::*;
use std::sync::Arc;
use std::io;
pub enum ReplaceTextureStatus {
// Call Again With Texture Binary
NeedTextureData,
// Done.
Ok,
}
pub type ProtocolResult<T> = Result<T, ProtocolError>;
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<Vec<Texture>>;
fn get_texture_by_id(&mut self, id: String) -> ProtocolResult<Option<Texture>>;
fn get_texture_by_name(&mut self, id: String) -> ProtocolResult<Option<Texture>>;
fn get_texture_file(&mut self, hash: Sha256) -> ProtocolResult<Arc<Vec<u8>>>;
fn get_texture_preview(&mut self, hash: Sha256) -> ProtocolResult<Arc<Vec<u8>>>;
fn replace_texture(
&mut self,
delete: Option<Texture>,
insert: Option<Texture>,
insert_texture_data: Option<Vec<u8>>,
) -> ProtocolResult<ReplaceTextureStatus>;
}
pub struct ProtocolConfig {
pub port: u16,
}
pub fn listen_forever(handler: &ProtocolHandler) -> io::Result<()> {
unimplemented!()
}

View File

@ -0,0 +1,44 @@
// TODO: remove on implementation
#![allow(unused_imports)]
#![allow(unused_variables)]
#![allow(dead_code)]
use crate::model::*;
use crate::protocol::*;
use std::sync::Arc;
pub struct ServerState {
// ...
}
impl ProtocolHandler for ServerState {
fn query(&mut self, query: &[String]) -> ProtocolResult<Vec<Texture>> {
unimplemented!()
}
fn get_texture_by_id(&mut self, id: String) -> ProtocolResult<Option<Texture>> {
unimplemented!()
}
fn get_texture_by_name(&mut self, id: String) -> ProtocolResult<Option<Texture>> {
unimplemented!()
}
fn get_texture_file(&mut self, hash: Sha256) -> ProtocolResult<Arc<Vec<u8>>> {
unimplemented!()
}
fn get_texture_preview(&mut self, hash: Sha256) -> ProtocolResult<Arc<Vec<u8>>> {
unimplemented!()
}
fn replace_texture(
&mut self,
delete: Option<Texture>,
insert: Option<Texture>,
insert_texture_data: Option<Vec<u8>>,
) -> ProtocolResult<ReplaceTextureStatus> {
unimplemented!()
}
}