use super::config;
use rocket;
use rocket::request::FromRequest;
use rocket::Request;
use rocket::http::{Cookie, Cookies};
use rocket::outcome::Outcome;
pub trait FromString{
fn from_string(s: String) -> Self;
}
impl FromString for String{
fn from_string(s: String) -> String{
s
}
}
pub struct UserPass<'c, T>{
pub user: T,
cookies: Cookies<'c>,
}
impl<'c, T> UserPass<'c, T> {
pub fn logout(&mut self) {
self.cookies.remove_private(Cookie::named(config::get_cookie_identifier()));
}
pub fn into_inner(self) -> T {
self.user
}
}
impl<'a,'r, T: FromString> FromRequest<'a, 'r> for UserPass<'a, T>{
type Error = ();
fn from_request(request: &'a Request<'r>) -> rocket::request::Outcome<UserPass<'a, T>,Self::Error>{
let cookie_id = config::get_cookie_identifier();
let mut cookies = request.cookies();
match cookies.get_private(&cookie_id){
Some(cookie) => Outcome::Success(UserPass{user: T::from_string(cookie.value().to_string()),cookies: cookies}),
None => Outcome::Forward(())
}
}
}