#[cfg_attr(not(feature = "hs-pow-full"), path = "pow/v1_stub.rs")]
pub mod v1;
use crate::doc::hsdesc::inner::HsInnerKwd;
use crate::parse::tokenize::Item;
use crate::{NetdocErrorKind as EK, Result};
use std::collections::HashSet;
use std::mem::Discriminant;
use v1::PowParamsV1;
#[derive(Debug, Clone)]
pub struct PowParamSet(Vec<PowParams>);
impl PowParamSet {
pub(super) fn slice(&self) -> &[PowParams] {
&self.0
}
pub(super) fn from_items(items: &[Item<'_, HsInnerKwd>]) -> Result<Self> {
let mut inner = Vec::new();
let mut schemes_seen: HashSet<Discriminant<PowParams>> = HashSet::new();
for item in items {
if let Some(parsed) = PowParams::try_from_item(item)? {
if schemes_seen.insert(std::mem::discriminant(&parsed)) {
inner.push(parsed);
} else {
return Err(EK::DuplicateToken
.with_msg(item.kwd_str().to_owned())
.at_pos(item.pos()));
}
}
}
Ok(Self(inner))
}
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum PowParams {
V1(PowParamsV1),
}
impl PowParams {
fn try_from_item(item: &Item<'_, HsInnerKwd>) -> Result<Option<Self>> {
let scheme = item.required_arg(0)?;
if scheme == "v1" {
Ok(Some(PowParams::V1(PowParamsV1::from_item(item)?)))
} else {
Ok(None)
}
}
}