// SPDX-FileCopyrightText: 2024 Simon Bruder // // SPDX-License-Identifier: AGPL-3.0-or-later use std::fmt; use diesel::prelude::*; use diesel_derive_enum::DbEnum; use serde::{Deserialize, Serialize}; use uuid::Uuid; use crate::schema::*; #[derive(Clone, Debug, Queryable, Selectable, Insertable, Serialize)] #[diesel(table_name = items)] #[diesel(check_for_backend(diesel::pg::Pg))] pub struct Item { pub id: Uuid, pub name: Option, pub parent: Option, pub class: Uuid, } #[derive(Debug, Insertable, Deserialize, AsChangeset)] #[diesel(table_name = items)] #[diesel(check_for_backend(diesel::pg::Pg))] #[diesel(treat_none_as_null = true)] pub struct NewItem { #[serde(default)] pub name: Option, #[serde(default)] pub parent: Option, pub class: Uuid, } #[derive(Clone, Debug, DbEnum, PartialEq, Deserialize, Serialize)] #[ExistingTypePath = "sql_types::ItemClassType"] #[serde(rename_all = "snake_case")] pub enum ItemClassType { Generic, Specific, } impl ItemClassType { pub const VARIANTS: [ItemClassType; 2] = [Self::Generic, Self::Specific]; } impl fmt::Display for ItemClassType { // FIXME: currently, the HTML form relies on this matching the serde serializsation. // This should not be the case. fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::Generic => write!(f, "generic"), Self::Specific => write!(f, "specific"), } } } #[derive(Clone, Debug, Queryable, Selectable, Insertable, Serialize)] #[diesel(table_name = item_classes)] #[diesel(check_for_backend(diesel::pg::Pg))] pub struct ItemClass { pub id: Uuid, pub name: String, pub r#type: ItemClassType, #[serde(skip_serializing_if = "Option::is_none")] pub parent: Option, } #[derive(Debug, Insertable, Deserialize, AsChangeset)] #[diesel(table_name = item_classes)] #[diesel(check_for_backend(diesel::pg::Pg))] pub struct NewItemClass { pub name: String, pub r#type: ItemClassType, #[serde(default)] pub parent: Option, }