shared/api/
endpoints.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
use std::error::Error;

use crate::api::Method;
pub use macros::{make_path_parts, PathPart};
use serde::{de::DeserializeOwned, Serialize};
use url::Url;
use uuid::Uuid;

//  add something for auth required?

/// Represents a A endpoint that the backend will support, and how to call it.
pub trait ApiEndpoint {
    /// The path type for this endpoint.
    type Path: PathParts;

    /// The request type for this endpoint.
    type Req: Serialize;

    /// The response type for this endpoint.
    type Res: DeserializeOwned + Serialize + 'static;

    /// The (inner) error type for this endpoint.
    type Err: DeserializeOwned + Serialize + Error + 'static;

    /// The method used to make a request to the endpoint.
    const METHOD: Method;
}

/// Search endpoints.
pub mod search;

/// Animation endpoints.
pub mod animation;

/// Category endpoints.
pub mod category;

/// Image endpoints.
pub mod image;

/// Meta endpoints.
pub mod meta;

/// User endpoints.
pub mod user;

/// JIG endpoints.
pub mod jig;

/// Administrative endpoints.
pub mod admin;

/// Audio endpoints
pub mod audio;

/// Web Media library endpoints
pub mod media;

/// Session endpoints
pub mod session;

/// Locale endpoints
pub mod locale;

/// Pdf endpoints
pub mod pdf;

/// Playlist endpoints
pub mod playlist;

/// Additional Resource endpoints
pub mod additional_resource;

/// Resource endpoints
pub mod resource;

/// Circle endpoints
pub mod circle;

/// Module endpoints
pub mod module;

/// Course endpoints
pub mod course;

/// Billing endpoints
pub mod billing;

/// Account endpoints
pub mod account;

/// Item that can be part of PathParts
pub trait PathPart {
    /// string value to replace placeholder with
    fn get_path_string(&self) -> String;
}

/// Path of ApiEndpoint
pub trait PathParts {
    /// API path
    const PATH: &'static str;

    /// path path with placeholders replaced with values
    fn get_filled(&self) -> String;
}

// TODO: think we should try to get rid of all these impls, we should use NewTypes instead

impl PathPart for Uuid {
    fn get_path_string(&self) -> String {
        self.to_string()
    }
}

impl PathPart for Url {
    fn get_path_string(&self) -> String {
        // maybe use urlencoding crate
        todo!();
    }
}

impl PathPart for i32 {
    fn get_path_string(&self) -> String {
        self.to_string()
    }
}

impl PathPart for u32 {
    fn get_path_string(&self) -> String {
        self.to_string()
    }
}

impl PathPart for i16 {
    fn get_path_string(&self) -> String {
        self.to_string()
    }
}