util: optimize opaque string formatting
This commit is contained in:
parent
e6c3c9c1ed
commit
8d6aaf79a7
3 changed files with 30 additions and 6 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
use {
|
use {
|
||||||
crate::utils::opaque::{opaque, Opaque, OpaqueError},
|
crate::utils::opaque::{opaque, Opaque, OpaqueError, OPAQUE_LEN},
|
||||||
|
arrayvec::ArrayString,
|
||||||
std::{
|
std::{
|
||||||
fmt::{Display, Formatter},
|
fmt::{Display, Formatter},
|
||||||
str::FromStr,
|
str::FromStr,
|
||||||
|
|
@ -13,6 +14,12 @@ pub fn activation_token() -> ActivationToken {
|
||||||
ActivationToken(opaque())
|
ActivationToken(opaque())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ActivationToken {
|
||||||
|
pub fn to_string(self) -> ArrayString<OPAQUE_LEN> {
|
||||||
|
self.0.to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Display for ActivationToken {
|
impl Display for ActivationToken {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
self.0.fmt(f)
|
self.0.fmt(f)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
use {
|
use {
|
||||||
|
arrayvec::ArrayString,
|
||||||
rand::{thread_rng, Rng},
|
rand::{thread_rng, Rng},
|
||||||
std::{
|
std::{
|
||||||
fmt::{Debug, Display, Formatter},
|
fmt::{Debug, Display, Formatter},
|
||||||
|
|
@ -22,6 +23,15 @@ pub fn opaque() -> Opaque {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Opaque {
|
||||||
|
pub fn to_string(self) -> ArrayString<OPAQUE_LEN> {
|
||||||
|
use std::fmt::Write;
|
||||||
|
let mut s = ArrayString::new();
|
||||||
|
write!(s, "{}", self).unwrap();
|
||||||
|
s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Display for Opaque {
|
impl Display for Opaque {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
write!(f, "{:016x}", self.hi)?;
|
write!(f, "{:016x}", self.hi)?;
|
||||||
|
|
@ -40,20 +50,20 @@ impl FromStr for Opaque {
|
||||||
type Err = OpaqueError;
|
type Err = OpaqueError;
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
if s.len() != LEN {
|
if s.len() != OPAQUE_LEN {
|
||||||
return Err(OpaqueError::InvalidLength);
|
return Err(OpaqueError::InvalidLength);
|
||||||
}
|
}
|
||||||
if !s.is_char_boundary(LEN / 2) {
|
if !s.is_char_boundary(OPAQUE_LEN / 2) {
|
||||||
return Err(OpaqueError::NotAscii);
|
return Err(OpaqueError::NotAscii);
|
||||||
}
|
}
|
||||||
let (hi, lo) = s.split_at(LEN / 2);
|
let (hi, lo) = s.split_at(OPAQUE_LEN / 2);
|
||||||
let hi = u64::from_str_radix(hi, 16).map_err(OpaqueError::Parse)?;
|
let hi = u64::from_str_radix(hi, 16).map_err(OpaqueError::Parse)?;
|
||||||
let lo = u64::from_str_radix(lo, 16).map_err(OpaqueError::Parse)?;
|
let lo = u64::from_str_radix(lo, 16).map_err(OpaqueError::Parse)?;
|
||||||
Ok(Self { lo, hi })
|
Ok(Self { lo, hi })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const LEN: usize = 32;
|
pub const OPAQUE_LEN: usize = 32;
|
||||||
|
|
||||||
#[derive(Debug, Error)]
|
#[derive(Debug, Error)]
|
||||||
pub enum OpaqueError {
|
pub enum OpaqueError {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use {
|
use {
|
||||||
crate::utils::opaque::{opaque, Opaque, OpaqueError},
|
crate::utils::opaque::{opaque, Opaque, OpaqueError, OPAQUE_LEN},
|
||||||
|
arrayvec::ArrayString,
|
||||||
std::{
|
std::{
|
||||||
fmt::{Display, Formatter},
|
fmt::{Display, Formatter},
|
||||||
str::FromStr,
|
str::FromStr,
|
||||||
|
|
@ -13,6 +14,12 @@ pub fn toplevel_identifier() -> ToplevelIdentifier {
|
||||||
ToplevelIdentifier(opaque())
|
ToplevelIdentifier(opaque())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ToplevelIdentifier {
|
||||||
|
pub fn to_string(self) -> ArrayString<OPAQUE_LEN> {
|
||||||
|
self.0.to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Display for ToplevelIdentifier {
|
impl Display for ToplevelIdentifier {
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
self.0.fmt(f)
|
self.0.fmt(f)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue