seedtool-cli 0.4.0

A command-line tool for generating and transforming cryptographic seeds.
use anyhow::Result;
use clap::ValueEnum;

use super::{
    Base6Format, Base10Format, Bip39Format, BitsFormat, BytewordsMinimalFormat,
    BytewordsStandardFormat, BytewordsUriFormat, CardsFormat, DiceFormat,
    EnvelopeFormat, HexFormat, IntsFormat, MultipartFormat, RandomFormat,
    SSKRFormat, SeedFormat,
};
use crate::cli::Cli;

pub trait Format {
    fn name(&self) -> &str;
    fn round_trippable(&self) -> bool;
}

pub trait InputFormat: Format {
    fn process_input(&self, state: Cli) -> Result<Cli>;
}

pub trait OutputFormat: Format {
    fn process_output(&self, _state: Cli) -> Result<String>;
}

#[derive(ValueEnum, Copy, Clone, Debug, PartialEq, Eq)]
pub enum InputFormatKey {
    Random,
    Hex,
    Btw,
    Btwu,
    Btwm,
    Bits,
    Cards,
    Dice,
    Base6,
    Base10,
    Ints,
    Bip39,
    Sskr,
    Envelope,
    Multipart,
    Seed,
}

pub fn select_input_format(
    input_format: InputFormatKey,
) -> Box<dyn InputFormat> {
    match input_format {
        InputFormatKey::Random => Box::new(RandomFormat),
        InputFormatKey::Hex => Box::new(HexFormat),
        InputFormatKey::Btw => Box::new(BytewordsStandardFormat),
        InputFormatKey::Btwu => Box::new(BytewordsUriFormat),
        InputFormatKey::Btwm => Box::new(BytewordsMinimalFormat),
        InputFormatKey::Bits => Box::new(BitsFormat),
        InputFormatKey::Cards => Box::new(CardsFormat),
        InputFormatKey::Dice => Box::new(DiceFormat),
        InputFormatKey::Base6 => Box::new(Base6Format),
        InputFormatKey::Base10 => Box::new(Base10Format),
        InputFormatKey::Ints => Box::new(IntsFormat),
        InputFormatKey::Bip39 => Box::new(Bip39Format),
        InputFormatKey::Sskr => Box::new(SSKRFormat),
        InputFormatKey::Envelope => Box::new(EnvelopeFormat),
        InputFormatKey::Multipart => Box::new(MultipartFormat),
        InputFormatKey::Seed => Box::new(SeedFormat),
    }
}

#[derive(ValueEnum, Copy, Clone, Debug, PartialEq, Eq)]
pub enum OutputFormatKey {
    Hex,
    Btw,
    Btwu,
    Btwm,
    Bits,
    Cards,
    Dice,
    Base6,
    Base10,
    Ints,
    Bip39,
    Sskr,
    Envelope,
    Multipart,
    Seed,
}

pub fn select_output_format(
    output_format: OutputFormatKey,
) -> Box<dyn OutputFormat> {
    match output_format {
        OutputFormatKey::Hex => Box::new(HexFormat),
        OutputFormatKey::Btw => Box::new(BytewordsStandardFormat),
        OutputFormatKey::Btwu => Box::new(BytewordsUriFormat),
        OutputFormatKey::Btwm => Box::new(BytewordsMinimalFormat),
        OutputFormatKey::Bits => Box::new(BitsFormat),
        OutputFormatKey::Cards => Box::new(CardsFormat),
        OutputFormatKey::Dice => Box::new(DiceFormat),
        OutputFormatKey::Base6 => Box::new(Base6Format),
        OutputFormatKey::Base10 => Box::new(Base10Format),
        OutputFormatKey::Ints => Box::new(IntsFormat),
        OutputFormatKey::Bip39 => Box::new(Bip39Format),
        OutputFormatKey::Sskr => Box::new(SSKRFormat),
        OutputFormatKey::Envelope => Box::new(EnvelopeFormat),
        OutputFormatKey::Multipart => Box::new(MultipartFormat),
        OutputFormatKey::Seed => Box::new(SeedFormat),
    }
}