authnz-common 0.2.1

Authnz common library (types and utils).
Documentation
//! Invite types module.

use impulse_server_kit::salvo;
use salvo::oapi::ToSchema;
use serde::{Deserialize, Serialize};

use crate::VecVisitor;

#[derive(Deserialize, Serialize, ToSchema, PartialEq, Eq, Hash, Clone)]
/// Used by C3A administrator for invite generation.
pub struct GenerateInvitationRequest {
  /// First 24 bytes of private C3A admin key.
  pub private_admin_key_begin: Vec<u8>,
}

#[derive(ToSchema, PartialEq, Eq, Hash, Clone)]
/// Unique invitation code.
pub struct Invite(Vec<u8>);

impl serde::Serialize for Invite {
  fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
    use serde::ser::SerializeSeq;

    let mut seq = serializer.serialize_seq(Some(self.0.len()))?;
    for el in self.0.as_slice() {
      seq.serialize_element(el)?;
    }
    seq.end()
  }
}

impl<'de> serde::Deserialize<'de> for Invite {
  fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
    Ok(Self(deserializer.deserialize_seq(VecVisitor)?))
  }
}

impl Invite {
  /// Create from raw bytes.
  pub fn from_raw(code: Vec<u8>) -> Self {
    Self(code)
  }

  /// Returns as slice.
  pub fn as_slice(&self) -> &[u8] {
    self.0.as_slice()
  }

  /// Returns as vec.
  pub fn into_raw(self) -> Vec<u8> {
    self.0
  }
}