actix_web_admin/
resource.rs1use async_trait::async_trait;
2use std::collections::HashMap;
3use crate::types::*;
4use serde::Serialize;
5
6#[derive(Clone)]
8pub struct AdminTitle(pub String);
9
10#[derive(Clone)]
12pub struct AdminPrefix(pub String);
13
14#[derive(Serialize, Debug)]
16pub struct ResourceInfo {
17 pub name: String,
18 pub plural_name: String,
19 pub slug: String,
20 pub icon: String,
21 pub path_list: String,
22 pub path_new: String,
23 pub path_edit: String,
24 pub path_delete: String,
25}
26
27#[async_trait]
29pub trait AdminResource: Send + Sync + 'static {
30 fn name(&self) -> &str;
32 fn plural_name(&self) -> &str;
34 fn slug(&self) -> &str;
36 fn icon(&self) -> &str { "box" }
38 fn list_columns(&self) -> Vec<Column>;
40 fn form_fields(&self) -> Vec<FormField>;
42 fn searchable_fields(&self) -> Vec<&str> { vec![] }
44 fn can_create(&self) -> bool { true }
46 fn can_delete(&self) -> bool { true }
48
49 async fn list(&self, query: ListQuery) -> Result<ListResult, AdminError>;
51 async fn get(&self, id: &str) -> Result<serde_json::Value, AdminError>;
53 async fn create(&self, data: HashMap<String, serde_json::Value>) -> Result<serde_json::Value, AdminError>;
55 async fn update(&self, id: &str, data: HashMap<String, serde_json::Value>) -> Result<serde_json::Value, AdminError>;
57 async fn delete(&self, id: &str) -> Result<(), AdminError>;
59
60 async fn validate(
62 &self,
63 _data: &HashMap<String, serde_json::Value>
64 ) -> Result<(), HashMap<String, String>> { Ok(()) }
65
66 fn info(&self, prefix: &str) -> ResourceInfo {
68 ResourceInfo {
69 name: self.name().to_string(),
70 plural_name: self.plural_name().to_string(),
71 slug: self.slug().to_string(),
72 icon: self.icon().to_string(),
73 path_list: format!("{}/{}/", prefix, self.slug()),
74 path_new: format!("{}/{}/new", prefix, self.slug()),
75 path_edit: format!("{}/{}/:id/edit", prefix, self.slug()),
76 path_delete: format!("{}/{}/:id/delete", prefix, self.slug()),
77 }
78 }
79}