Struct Namespace

Source
pub struct Namespace {
    pub handlers: ApiHandlers,
    pub path: Path,
    pub coercer: Option<Builder>,
    /* private fields */
}

Fields§

§handlers: ApiHandlers§path: Path§coercer: Option<Builder>

Implementations§

Source§

impl Namespace

Source

pub fn new(path: &str) -> Namespace

Source

pub fn params<F>(&mut self, builder: F)
where F: FnOnce(&mut Builder),

Examples found in repository?
examples/simple.rs (lines 82-84)
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
139
140
141
142
143
144
145
146
147
148
149
150
fn main() {

    let mut app = rustless::Application::new(rustless::Api::build(|api| {
        api.prefix("api");
        api.version("v1", rustless::Versioning::Path);

        api.mount(swagger::create_api("api-docs"));

        api.error_formatter(|err, _media| {
            match err.downcast::<UnauthorizedError>() {
                Some(_) => {
                    return Some(rustless::Response::from(
                        status::StatusCode::Unauthorized,
                        Box::new("Please provide correct `token` parameter")
                    ))
                },
                None => None
            }
        });

        api.post("greet/:name", |endpoint| {
            endpoint.summary("Sends greeting");
            endpoint.desc("Use this to talk to yourself");
            endpoint.params(|params| {
                params.req_typed("name", json_dsl::string());
                params.req_typed("greeting", json_dsl::string());
            });
            endpoint.handle(|client, params| {
                client.text(
                    format!("{}, {}",
                        params.find("greeting").unwrap().to_string(),
                        params.find("name").unwrap().to_string())
                )
            })
        });

        api.get("echo", |endpoint| {
            endpoint.summary("Sends back what it gets");
            endpoint.desc("Use this to talk to yourself");
            endpoint.handle(|client, params| {
                client.json(params)
            })
        });

        api.namespace("admin", |admin_ns| {

            admin_ns.params(|params| {
                params.req_typed("token", json_dsl::string())
            });

            // Using after_validation callback to check token
            admin_ns.after_validation(|_client, params| {

                match params.find("token") {
                    // We can unwrap() safely because token in validated already
                    Some(token) => if token.as_str().unwrap() == "password1" { return Ok(()) },
                    None => ()
                }

                // Fire error from callback is token is wrong
                return Err(rustless::ErrorResponse{
                    error: Box::new(UnauthorizedError) as Box<Error + Send>,
                    response: None
                })

            });

            // This `/api/admin/server_status` endpoint is secure now
            admin_ns.get("server_status", |endpoint| {
                endpoint.summary("Get server status");
                endpoint.desc("Use this API to receive some useful information about the state of our server");
                endpoint.handle(|client, _params| {
                    {
                        let cookies = client.request.cookies();

                        #[cfg(feature = "ssl")]
                        let signed_cookies = cookies.signed();
                        #[cfg(not(feature = "ssl"))]
                        let signed_cookies = cookies;

                        let user_cookie = Cookie::new("session".to_string(), "verified".to_string());
                        signed_cookies.add(user_cookie);
                    }

                    client.text("Everything is OK".to_string())
                })
            });
        })
    }));

    swagger::enable(&mut app, swagger::Spec {
        info: swagger::Info {
            title: "Example API".to_string(),
            description: Some("Simple API to demonstration".to_string()),
            contact: Some(swagger::Contact {
                name: "Stanislav Panferov".to_string(),
                url: Some("http://panferov.me".to_string()),
                ..std::default::Default::default()
            }),
            license: Some(swagger::License {
                name: "MIT".to_string(),
                url: "http://opensource.org/licenses/MIT".to_string()
            }),
            ..std::default::Default::default()
        },
        ..std::default::Default::default()
    });

    let mut chain = iron::Chain::new(app);
    chain.link(::rustless::batteries::cookie::new("secretsecretsecretsecretsecretsecretsecret".as_bytes()));

    iron::Iron::new(chain).http("0.0.0.0:4000").unwrap();
    println!("On 4000");

}
Source

pub fn build<F>(path: &str, builder: F) -> Namespace
where F: FnOnce(&mut Namespace),

Trait Implementations§

Source§

impl ApiHandler for Namespace

Source§

fn api_call<'a, 'r>( &'a self, rest_path: &str, params: &mut JsonValue, req: &'r mut (dyn Request + 'r), info: &mut CallInfo<'a>, ) -> HandleResult<Response>

Source§

impl Nesting for Namespace

Source§

fn mount<H>(&mut self, edp: H)
where H: ApiHandler + Send + Sync,

Source§

fn namespace<F>(&mut self, path: &str, builder: F)
where F: FnOnce(&mut Namespace),

Source§

fn group<F>(&mut self, path: &str, builder: F)
where F: FnOnce(&mut Namespace),

Source§

fn resource<F>(&mut self, path: &str, builder: F)
where F: FnOnce(&mut Namespace),

Source§

fn resources<F>(&mut self, path: &str, builder: F)
where F: FnOnce(&mut Namespace),

Source§

fn segment<F>(&mut self, path: &str, builder: F)
where F: FnOnce(&mut Namespace),

Source§

fn get<F>(&mut self, path: &str, builder: F)

Source§

fn post<F>(&mut self, path: &str, builder: F)

Source§

fn put<F>(&mut self, path: &str, builder: F)

Source§

fn delete<F>(&mut self, path: &str, builder: F)

Source§

fn options<F>(&mut self, path: &str, builder: F)

Source§

fn head<F>(&mut self, path: &str, builder: F)

Source§

fn before<F>(&mut self, callback: F)
where F: for<'a> Fn(&'a mut Client<'_>, &JsonValue) -> HandleSuccessResult + Send + Sync + 'static,

Source§

fn before_validation<F>(&mut self, callback: F)
where F: for<'a> Fn(&'a mut Client<'_>, &JsonValue) -> HandleSuccessResult + Send + Sync + 'static,

Source§

fn after<F>(&mut self, callback: F)
where F: for<'a> Fn(&'a mut Client<'_>, &JsonValue) -> HandleSuccessResult + Send + Sync + 'static,

Source§

fn after_validation<F>(&mut self, callback: F)
where F: for<'a> Fn(&'a mut Client<'_>, &JsonValue) -> HandleSuccessResult + Send + Sync + 'static,

Source§

fn call_handlers<'a, 'r>( &'a self, rest_path: &str, params: &mut JsonValue, req: &'r mut (dyn Request + 'r), info: &mut CallInfo<'a>, ) -> HandleResult<Response>

Source§

impl Node for Namespace

Source§

fn get_handlers<'a>(&'a self) -> &'a ApiHandlers

Source§

fn get_handlers_mut<'a>(&'a mut self) -> &'a mut ApiHandlers

Source§

fn get_before<'a>(&'a self) -> &'a Callbacks

Source§

fn get_before_mut<'a>(&'a mut self) -> &'a mut Callbacks

Source§

fn get_before_validation<'a>(&'a self) -> &'a Callbacks

Source§

fn get_before_validation_mut<'a>(&'a mut self) -> &'a mut Callbacks

Source§

fn get_after_validation<'a>(&'a self) -> &'a Callbacks

Source§

fn get_after_validation_mut<'a>(&'a mut self) -> &'a mut Callbacks

Source§

fn get_after<'a>(&'a self) -> &'a Callbacks

Source§

fn get_after_mut<'a>(&'a mut self) -> &'a mut Callbacks

Source§

fn push_node<'a>(&'a self, _info: &mut CallInfo<'a>)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PersistentInto<Arc<Mutex<T>>> for T

Source§

fn persistent_into(self) -> Arc<Mutex<T>>

Convert self into a value of type T.
Source§

impl<T> PersistentInto<Arc<RwLock<T>>> for T

Source§

fn persistent_into(self) -> Arc<RwLock<T>>

Convert self into a value of type T.
Source§

impl<T> PersistentInto<Arc<T>> for T

Source§

fn persistent_into(self) -> Arc<T>

Convert self into a value of type T.
Source§

impl<T> PersistentInto<T> for T

Source§

fn persistent_into(self) -> T

Convert self into a value of type T.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Typeable for T
where T: Any,

Source§

fn get_type(&self) -> TypeId

Get the TypeId of this object.
Source§

impl<T> UnsafeAny for T
where T: Any,