stoken 0.0.6

a rust based stoken implementation
Documentation
use std::fs::File;
use std::path::Path;

use serde::{Deserialize, Serialize};
use serde_xml_rs::{from_reader, from_str};

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct TKNHeader {
    pub version: i32,
    pub secret: String,
    pub origin: String,
    pub dest: String,
    pub name: String,

    #[serde(rename = "HeaderMAC")]
    pub mac: String,
    #[serde(rename = "DefInterval")]
    pub interval: i32,

    #[serde(rename = "DefBirth")]
    pub start: String,

    #[serde(rename = "DefDeath")]
    pub end: String,

    #[serde(rename = "DefAlg")]
    pub alg: i32,

    #[serde(rename = "DefDigits")]
    pub number_of_digits: usize,

    #[serde(rename = "DefMode")]
    pub mode: i32,

    #[serde(rename = "DefAddPIN")]
    pub add_pin: i32,

    #[serde(rename = "DefLocalPIN")]
    pub local_pin: i32,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct TKN {
    #[serde(rename = "SN")]
    pub serial_number: String,
    pub seed: String,
    pub user_first_name: String,
    pub user_last_name: String,
    pub user_login: String,
    pub pin_type: Option<i32>,
    #[serde(rename = "TokenMAC")]
    pub mac: String,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
pub struct TKNTrailer {
    #[serde(rename = "BatchSignature")]
    pub signature: String,
    #[serde(rename = "BatchCertificate")]
    pub certificate: String,
}

#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
pub struct TKNBatch {
    #[serde(rename = "TKNHeader")]
    pub header: TKNHeader,
    #[serde(rename = "TKN")]
    pub token: TKN,
    #[serde(rename = "TKNTrailer")]
    pub trailer: TKNTrailer,
}

pub fn read_file<P: AsRef<Path>>(file_path: P) -> TKNBatch {
    let file = File::open(file_path).unwrap();
    from_reader(file).unwrap()
}

pub fn read_xml_string(contents: &str) -> TKNBatch {
    from_str(contents).unwrap()
}

#[cfg(test)]
mod tests {
    #[test]
    fn parse_xml_succeeds() {
        use crate::tokens::generate::tests::test_file;
        let token = super::read_file(test_file());
        println!("{:?}", token);
        assert_eq!(token.token.user_login, "jake");
    }
}