mapkitjs-token-gen 0.2.0

This utility library provides wrapper functions to generate MapKitJS valid jwt tokens for your rust program.
Documentation
extern crate jsonwebtoken;
extern crate serde;

mod tests;

use jsonwebtoken::{encode, Algorithm, Header, EncodingKey};
use serde::{Serialize, Deserialize};
use std::fs;

#[derive(Debug, Serialize, Deserialize)]
pub enum TokenType {
   JWT 
}

#[derive(Debug, Serialize, Deserialize)]
pub struct TokenHeader {
    kid: Option<String>,
    typ: TokenType,
}

impl TokenHeader {
    pub fn new(kid: &str, typ: TokenType) -> Self {
        TokenHeader { 
            kid: Option::Some(kid.to_string()), 
            typ,
        }
    }

    pub fn new_with_key_id(key_id: &str, typ: TokenType) -> Self {
        TokenHeader::new(key_id, typ)
    }

    pub fn typ_to_value(&self) -> Option<String>{
        let value = match self.typ {
            TokenType::JWT => "JWT".to_string(),
        };
        Option::Some(value)
    }
}

#[derive(Debug, Serialize, Deserialize)]
pub struct TokenPayload{
    iss: String,
    iat: i64,
    exp: i64,
    origin: String,
}

impl TokenPayload{
    pub fn new(
        iss: &str,
        iat: i64,
        exp: i64,
        origin: &str 
    ) -> Self {
        TokenPayload { 
            iss: iss.to_string(),
            iat,
            exp,
            origin: origin.to_string(),
        }
    }

    pub fn new_with(
        team_id: &str, 
        created_at: i64, 
        expires_at: i64,
        origin: &str
    ) -> Self {
        TokenPayload::new(team_id, created_at, expires_at, origin)
    }
}

pub fn generate_with_filepath(
    filepath: &str,
    header: TokenHeader,
    payload: TokenPayload
) -> String {
    let data = fs::read(filepath)
        .expect("Unable to read file");
    
    generate_with_data(data, header, payload)
}

pub fn generate_with_key_file(
    key_file: &str,
    key_id: &str,
    typ: TokenType,
    team_id: &str,
    created_at: i64,
    expires_at: i64,
    origin: &str,
) -> String {
    let header = TokenHeader::new_with_key_id(key_id, typ);
    let payload = TokenPayload::new_with(team_id, created_at, expires_at, origin);
    generate_with_filepath(key_file, header, payload)
}

pub fn generate_with_key_data(
    key_data: Vec<u8>,
    key_id: &str,
    typ: TokenType,
    team_id: &str,
    created_at: i64,
    expires_at: i64,
    origin: &str, 
) -> String {
    let header = TokenHeader::new_with_key_id(key_id, typ);
    let payload = TokenPayload::new_with(team_id, created_at, expires_at, origin);
    generate_with_data(key_data, header, payload)
}

pub fn generate_with_data(
    data: Vec<u8>,
    header: TokenHeader,
    payload: TokenPayload
) -> String {
   let encoded_key = match  EncodingKey::from_ec_pem(&data) {
        Ok(v) => v, 
        Err(e) => panic!(e), 
    };

    let mut _header = Header::new(Algorithm::ES256);
    _header.kid = header.kid.clone(); 
    _header.typ = header.typ_to_value();

    encode(&_header, &payload, &encoded_key).unwrap()
}