use std::fs;
use std::path::Path;
use serde::Deserialize;
use crate::error::Result;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum PadToken {
Id(u32),
Named(String),
Unknown,
}
#[derive(Deserialize)]
struct PadConfig {
#[serde(default)]
pad_token_id: Option<i64>,
}
#[derive(Deserialize)]
struct TokenizerConfig {
#[serde(default)]
pad_token: Option<PadTokenField>,
#[serde(default)]
mask_token: Option<PadTokenField>,
}
#[derive(Deserialize)]
#[serde(untagged)]
enum PadTokenField {
Plain(String),
Added { content: String },
}
pub fn read_pad_token(config_json: &str, tokenizer_config: Option<&Path>) -> Result<PadToken> {
let cfg: PadConfig = serde_json::from_str(config_json)?;
if let Some(id) = cfg.pad_token_id.and_then(|id| u32::try_from(id).ok()) {
return Ok(PadToken::Id(id));
}
if let Some(path) = tokenizer_config {
let tc: TokenizerConfig = serde_json::from_str(&fs::read_to_string(path)?)?;
if let Some(field) = tc.pad_token {
return Ok(PadToken::Named(match field {
PadTokenField::Plain(name) => name,
PadTokenField::Added { content } => content,
}));
}
}
Ok(PadToken::Unknown)
}
pub fn read_mask_token(tokenizer_config: Option<&Path>) -> Result<String> {
if let Some(path) = tokenizer_config {
let tc: TokenizerConfig = serde_json::from_str(&fs::read_to_string(path)?)?;
if let Some(field) = tc.mask_token {
return Ok(match field {
PadTokenField::Plain(name) => name,
PadTokenField::Added { content } => content,
});
}
}
Ok("[MASK]".to_string())
}