use std::collections::HashSet;
use std::fmt::Debug;
use serde::{Deserialize, Serialize};
use uuid;
use uuid::Uuid;
use yew::Html;
#[derive(Serialize, Deserialize, Debug)]
pub enum AccessLevel {
PUBLIC,
NSFW,
NSFL,
CREDENTIALS,
APOCALYPTIC,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Props {
uuid: Uuid,
votes: i64,
access: AccessLevel,
}
pub trait Search {
fn indexable_content(&self) -> String;
fn title(&self) -> String;
}
pub trait Relation {
fn parents(&self) -> HashSet<Uuid>;
fn children(&self) -> HashSet<Uuid>;
fn sources(&self) -> HashSet<Uuid>;
}
pub trait Render {
fn render(&self) -> Html;
}
pub trait Edit {
fn editor(&self) -> Html;
}
#[typetag::serde(tag = "type")]
pub trait Note: Search + Relation + Render + Edit + Debug {
fn props(&self) -> &Props;
}
#[typetag::serde(tag = "type")]
pub trait Resource: Search + Relation + Render + Debug {
fn props(&self) -> &Props;
fn url(&self) -> String;
fn mime(&self) -> String;
}