1+ use std:: fmt:: Debug ;
2+
3+ use serde:: { Deserialize , Serialize } ;
4+ use serde_enum_str:: * ;
5+
6+ use super :: { user:: User , app:: App , FetchError } ;
7+ #[ derive( Deserialize_enum_str , Serialize_enum_str , Clone ) ]
8+ pub enum Feature {
9+ #[ serde( rename = "start_app" ) ]
10+ Start ,
11+ #[ serde( rename = "stop_app" ) ]
12+ Stop ,
13+ #[ serde( rename = "restart_app" ) ]
14+ Restart ,
15+ #[ serde( rename = "logs_app" ) ]
16+ SeeLogs ,
17+ #[ serde( rename = "commit_app" ) ]
18+ Commit ,
19+ #[ serde( rename = "status_app" ) ]
20+ Status ,
21+ #[ serde( rename = "edit_ram" ) ]
22+ SetRam ,
23+ #[ serde( rename = "backup_app" ) ]
24+ Backup
25+ }
26+ impl Debug for Feature {
27+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
28+ f. write_str (
29+ match self {
30+ Self :: Backup => "backup" ,
31+ Self :: Commit => "commit" ,
32+ Self :: Restart => "restart" ,
33+ Self :: SeeLogs => "logs" ,
34+ Self :: SetRam => "ram" ,
35+ Self :: Start => "start" ,
36+ Self :: Status => "status" ,
37+ Self :: Stop => "stop"
38+ }
39+ )
40+ }
41+ }
42+ #[ derive( Deserialize , Serialize ) ]
43+ pub struct Mod {
44+ #[ serde( rename = "mod_id" ) ]
45+ user_id : u128 ,
46+ #[ serde( rename = "perms" ) ]
47+ features : Vec < Feature >
48+ }
49+ impl Mod {
50+ pub fn new ( token : String , user : & User , app : & App , features : Vec < Feature > ) -> Result < Mod , FetchError > {
51+ let moderator = Self {
52+ user_id : user. user_id . parse ( ) . unwrap ( ) ,
53+ features
54+ } ;
55+ moderator. add_to ( token, app) ?;
56+ Ok ( moderator)
57+ }
58+ pub fn get_features ( & self ) -> Vec < Feature > {
59+ self . features . clone ( )
60+ }
61+ pub fn add_to ( & self , token : String , app : & App ) -> Result < ( ) , FetchError > {
62+ #[ derive( Deserialize ) ]
63+ struct Response {
64+ status : String ,
65+ message : Option < String >
66+ }
67+ let client = reqwest:: blocking:: Client :: new ( ) ;
68+ let req = client
69+ . post ( crate :: api_url!( format!( "/app/{}/team" , app. id) ) )
70+ . header ( "api-token" , token)
71+ . json ( self ) ;
72+ match req. send ( ) {
73+ Ok ( res) => {
74+ match res. json :: < Response > ( ) {
75+ Err ( err) => {
76+ Err ( FetchError :: FailedWithMessage ( err. to_string ( ) ) )
77+ }
78+ Ok ( response) => {
79+ if response. status == "ok" {
80+ Ok ( ( ) )
81+ } else {
82+ Err ( FetchError :: FailedWithMessage ( response. message . unwrap ( ) ) )
83+ }
84+ }
85+ }
86+
87+ }
88+ Err ( err) => Err ( FetchError :: FailedToConnect ( err) ) ,
89+ }
90+ }
91+ }
0 commit comments