tokidator 0.2.1

Token based authentication framework
Documentation
use protobuf::{Message, parse_from_bytes};

use crate::policy::PolicySet;
use crate::policy::tests::TestPolicy;
use crate::token::PolicyAccessToken;

#[derive(Debug)]
pub struct TestAccessToken {
    policies: PolicySet<TestPolicy>,
    expired: bool,
}

impl TestAccessToken {
    pub fn new(policies: PolicySet<TestPolicy>, expired: bool) -> TestAccessToken {
        Self {
            policies,
            expired,
        }
    }
}

impl PolicyAccessToken for TestAccessToken {
    type Policy = TestPolicy;

    fn policies(&self) -> &PolicySet<Self::Policy> {
        &self.policies
    }

    fn is_expired(&self) -> bool {
        self.expired
    }

    fn to_bytes(&self) -> Vec<u8> {
        let policies = self.policies.to_bytes();
        let mut builder = crate::protos::TestAccessToken::new();
        builder.set_policies(policies);
        builder.set_expired(self.expired);
        builder.write_to_bytes().expect("Fail build bytes from test policy")
    }

    fn from_bytes(buf: &[u8]) -> Option<Self> {
        if let Ok(t) = parse_from_bytes::<crate::protos::TestAccessToken>(buf) {
            if let Ok(ps) = PolicySet::from_bytes(t.policies.as_slice()) {
                return Some(Self::new(ps, t.expired));
            }
        }
        None
    }
}