pub mod types;
pub mod semantic_types;
pub mod lambda_terms;
pub mod lambda_parser;
pub mod type_driven_grammar;
pub mod grammar;
pub mod generator;
pub mod merkle;
pub mod codec;
pub mod pipeline;
pub mod scale;
pub mod image_codec;
#[cfg(feature = "wasm")]
pub mod wasm;
pub use types::Pos;
pub use grammar::{Grammar, SequenceWithProbability, DialectConfig};
pub use generator::{
GenerationMode, SentenceLengthMode, PayloadTok, Lexicon,
generate_text, generate_text_with_original_payload, generate_text_best_of,
max_subsequence_embedding, plan_sentence, fill_slots,
SequenceCache, print_sentence_kinds_once,
normalize_token_for_bip39, wrap_payload_with_bars, wrap_payload_with_color,
word_wrap, capitalize, payload_fits, get_grammar, get_dialect_config, mode_to_dialect,
starts_with_vowel_sound,
load_payload_words, load_payload_words_for_wordlist,
load_cover_words_by_pos, load_cover_words_by_pos_for_wordlist,
build_pos_mapping, build_pos_mapping_for_wordlist,
tag_word, select_random_words, wordlist_filenames, default_wordlist,
load_payload_tree, load_cover_tree, load_cover_word_pos_tags,
get_embedded_yaml, has_embedded_files, get_available_languages,
get_available_wordlists,
detect_dialect, detect_dialect_filtered, detect_dialect_with, detect_dialect_best,
DialectMatch, DialectFilter,
inject_scale_payload,
};
#[cfg(not(target_arch = "wasm32"))]
pub use generator::get_wordlist_path;
pub use merkle::{WordlistTree, merkleize, parse_merkleized, verify_merkleized};
pub use codec::{
encode_base_n, decode_base_n, encode_str_base_n,
detect_mode, DataMode, DecodeError,
hex_encode, hex_decode, base64_encode, base64_decode,
};
pub use pipeline::{Pipeline, Endpoint, Verb, PipelineError, encode_into_language, decode_from_language, cached_payload_tree};
#[cfg(feature = "native")]
use nlprule::{Tokenizer, Rules};
#[cfg(feature = "native")]
use anyhow::{Result, Context};
#[cfg(feature = "native")]
#[derive(Debug, Clone, Copy)]
pub enum Language {
English,
}
#[cfg(feature = "native")]
impl Language {
fn code(&self) -> &'static str {
match self {
Language::English => "en",
}
}
fn tokenizer_filename(&self) -> String {
format!("{}_tokenizer.bin", self.code())
}
fn rules_filename(&self) -> String {
format!("{}_rules.bin", self.code())
}
}
#[cfg(feature = "native")]
pub struct GrammarChecker {
tokenizer: Tokenizer,
rules: Rules,
}
#[cfg(feature = "native")]
impl GrammarChecker {
pub fn from_paths(tokenizer_path: &str, rules_path: &str) -> Result<Self> {
let tokenizer = Tokenizer::new(tokenizer_path)
.with_context(|| format!("Failed to load tokenizer from {}", tokenizer_path))?;
let rules = Rules::new(rules_path)
.with_context(|| format!("Failed to load rules from {}", rules_path))?;
Ok(Self { tokenizer, rules })
}
pub fn from_language(language: Language) -> Result<Self> {
let tokenizer_filename = language.tokenizer_filename();
let rules_filename = language.rules_filename();
let locations = vec![
"/opt/nlprule-data/", "/app/data/", "data/", "", ];
for location in &locations {
let tokenizer_path = format!("{}{}", location, tokenizer_filename);
let rules_path = format!("{}{}", location, rules_filename);
if std::path::Path::new(&tokenizer_path).exists() &&
std::path::Path::new(&rules_path).exists() {
return Self::from_paths(&tokenizer_path, &rules_path);
}
}
Self::from_paths(&tokenizer_filename, &rules_filename)
.with_context(|| format!(
"Could not find {} and {} in any of: current directory, data/, /app/data/, or /opt/nlprule-data/",
tokenizer_filename, rules_filename
))
}
pub fn check(&self, text: &str) -> Vec<nlprule::types::Suggestion> {
self.rules.suggest(text, &self.tokenizer)
}
pub fn correct(&self, text: &str) -> String {
self.rules.correct(text, &self.tokenizer)
}
pub fn tokenize<'a>(&'a self, text: &'a str) -> impl Iterator<Item = nlprule::types::Sentence<'a>> {
self.tokenizer.pipe(text)
}
pub fn is_correct(&self, text: &str) -> bool {
let suggestions = self.check(text);
suggestions.is_empty()
}
}
#[cfg(all(test, feature = "native"))]
mod tests {
use super::*;
#[test]
fn test_grammar_checking() -> Result<()> {
let grammar_checker = match GrammarChecker::from_language(Language::English) {
Ok(checker) => checker,
Err(_) => {
return Ok(());
}
};
let sentence = "The quick brown fox jumps over the lazy dog.";
let suggestions = grammar_checker.check(sentence);
println!("Suggestions for test sentence: {:?}", suggestions);
Ok(())
}
}