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()
}
}