mod server;
pub use server::FabFire;

use rsasl::mechname::Mechname;
use rsasl::registry::{Matches, Mechanism, Named, Side, MECHANISMS};

const MECHNAME: &'static Mechname = &Mechname::const_new_unchecked(b"X-FABFIRE");

#[linkme::distributed_slice(MECHANISMS)]
pub static FABFIRE: Mechanism = Mechanism::build(
    MECHNAME,
    300,
    None,
    Some(FabFire::new_server),
    Side::Client,
    |_| Some(Matches::<Select>::name()),
    |_| true,
);

struct Select;
impl Named for Select {
    fn mech() -> &'static Mechanism {
        &FABFIRE
    }
}

use rsasl::property::SizedProperty;
use std::marker::PhantomData;

// All Property types must implement Debug.
#[derive(Debug)]
// The `PhantomData` in the constructor is only used so external crates can't construct this type.
pub struct FabFireCardKey(PhantomData<()>);

impl SizedProperty<'_> for FabFireCardKey {
    type Value = [u8; 16];
    const DESCRIPTION: &'static str = "A AES128 key for a FabFire card";
}