pub mod extended;
use crate::error::Result;
use fake::Fake;
use rand::rngs::StdRng;
use rand::SeedableRng;
use sha2::{Digest, Sha256};
use std::collections::HashMap;
use std::sync::Arc;
use tera::{Function, Tera, Value};
pub fn register_functions(
tera: &mut Tera,
determinism: Option<Arc<dyn TimestampProvider + Send + Sync>>,
) -> Result<()> {
tera.register_function("env", EnvFunction);
tera.register_function("now_rfc3339", NowRfc3339Function::new(determinism.clone()));
tera.register_function("sha256", Sha256Function);
tera.register_function("toml_encode", TomlEncodeFunction);
register_fake_data_functions(tera, determinism.clone());
extended::register_extended_functions(tera);
Ok(())
}
pub trait TimestampProvider {
fn get_timestamp_rfc3339(&self) -> String;
}
fn register_fake_data_functions(
tera: &mut Tera,
_determinism: Option<Arc<dyn TimestampProvider + Send + Sync>>,
) {
tera.register_function("fake_uuid", FakeUuidFunction);
tera.register_function("fake_uuid_seeded", FakeUuidSeededFunction);
tera.register_function("fake_name", FakeNameFunction);
tera.register_function("fake_first_name", FakeFirstNameFunction);
tera.register_function("fake_last_name", FakeLastNameFunction);
tera.register_function("fake_title", FakeTitleFunction);
tera.register_function("fake_suffix", FakeSuffixFunction);
tera.register_function("fake_email", FakeEmailFunction);
tera.register_function("fake_username", FakeUsernameFunction);
tera.register_function("fake_password", FakePasswordFunction);
tera.register_function("fake_domain", FakeDomainFunction);
tera.register_function("fake_url", FakeUrlFunction);
tera.register_function("fake_ipv4", FakeIpv4Function);
tera.register_function("fake_ipv6", FakeIpv6Function);
tera.register_function("fake_user_agent", FakeUserAgentFunction);
tera.register_function("fake_mac_address", FakeMacAddressFunction);
tera.register_function("fake_street", FakeStreetFunction);
tera.register_function("fake_city", FakeCityFunction);
tera.register_function("fake_state", FakeStateFunction);
tera.register_function("fake_zip", FakeZipFunction);
tera.register_function("fake_country", FakeCountryFunction);
tera.register_function("fake_latitude", FakeLatitudeFunction);
tera.register_function("fake_longitude", FakeLongitudeFunction);
tera.register_function("fake_phone", FakePhoneFunction);
tera.register_function("fake_cell_phone", FakeCellPhoneFunction);
tera.register_function("fake_company", FakeCompanyFunction);
tera.register_function("fake_company_suffix", FakeCompanySuffixFunction);
tera.register_function("fake_industry", FakeIndustryFunction);
tera.register_function("fake_profession", FakeProfessionFunction);
tera.register_function("fake_word", FakeWordFunction);
tera.register_function("fake_words", FakeWordsFunction);
tera.register_function("fake_sentence", FakeSentenceFunction);
tera.register_function("fake_paragraph", FakeParagraphFunction);
tera.register_function("fake_int", FakeIntFunction);
tera.register_function("fake_int_range", FakeIntRangeFunction);
tera.register_function("fake_float", FakeFloatFunction);
tera.register_function("fake_bool", FakeBoolFunction);
tera.register_function("fake_date", FakeDateFunction);
tera.register_function("fake_time", FakeTimeFunction);
tera.register_function("fake_datetime", FakeDateTimeFunction);
tera.register_function("fake_timestamp", FakeTimestampFunction);
tera.register_function("fake_credit_card", FakeCreditCardFunction);
tera.register_function("fake_currency_code", FakeCurrencyCodeFunction);
tera.register_function("fake_currency_name", FakeCurrencyNameFunction);
tera.register_function("fake_currency_symbol", FakeCurrencySymbolFunction);
tera.register_function("fake_filename", FakeFilenameFunction);
tera.register_function("fake_extension", FakeExtensionFunction);
tera.register_function("fake_mime_type", FakeMimeTypeFunction);
tera.register_function("fake_file_path", FakeFilePathFunction);
tera.register_function("fake_color", FakeColorFunction);
tera.register_function("fake_hex_color", FakeHexColorFunction);
tera.register_function("fake_rgb_color", FakeRgbColorFunction);
tera.register_function("fake_string", FakeStringFunction);
tera.register_function("fake_port", FakePortFunction);
tera.register_function("fake_semver", FakeSemverFunction);
}
struct EnvFunction;
impl Function for EnvFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
let name = args
.get("name")
.and_then(|v| v.as_str())
.ok_or_else(|| tera::Error::msg("env() requires 'name' parameter"))?;
std::env::var(name)
.map(Value::String)
.map_err(|_| tera::Error::msg(format!("Environment variable '{}' not found", name)))
}
}
struct NowRfc3339Function {
provider: Option<Arc<dyn TimestampProvider + Send + Sync>>,
}
impl NowRfc3339Function {
fn new(provider: Option<Arc<dyn TimestampProvider + Send + Sync>>) -> Self {
Self { provider }
}
}
impl Function for NowRfc3339Function {
fn call(&self, _args: &HashMap<String, Value>) -> tera::Result<Value> {
if let Some(ref provider) = self.provider {
Ok(Value::String(provider.get_timestamp_rfc3339()))
} else {
Ok(Value::String(chrono::Utc::now().to_rfc3339()))
}
}
}
struct Sha256Function;
impl Function for Sha256Function {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
let input = args
.get("s")
.and_then(|v| v.as_str())
.ok_or_else(|| tera::Error::msg("sha256() requires 's' parameter"))?;
let mut hasher = Sha256::new();
hasher.update(input.as_bytes());
let result = hasher.finalize();
Ok(Value::String(format!("{:x}", result)))
}
}
struct TomlEncodeFunction;
impl Function for TomlEncodeFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
let value = args
.get("value")
.ok_or_else(|| tera::Error::msg("toml_encode() requires 'value' parameter"))?;
let toml_str = match value {
Value::String(s) => format!("\"{}\"", s.replace('\"', "\\\"")),
Value::Number(n) => n.to_string(),
Value::Bool(b) => b.to_string(),
Value::Array(arr) => {
let items: Vec<String> = arr
.iter()
.map(|v| match v {
Value::String(s) => format!("\"{}\"", s.replace('\"', "\\\"")),
_ => v.to_string(),
})
.collect();
format!("[{}]", items.join(","))
}
Value::Object(obj) => {
let items: Vec<String> = obj
.iter()
.map(|(k, v)| match v {
Value::String(s) => {
format!("\"{}\"=\"{}\"", k, s.replace('\"', "\\\""))
}
_ => format!("\"{}\"={}", k, v),
})
.collect();
format!("{{{}}}", items.join(","))
}
Value::Null => "null".to_string(),
};
Ok(Value::String(toml_str))
}
}
fn get_seed(args: &HashMap<String, Value>) -> u64 {
args.get("seed")
.and_then(|v| v.as_u64())
.unwrap_or_else(rand::random)
}
struct FakeUuidFunction;
impl Function for FakeUuidFunction {
fn call(&self, _args: &HashMap<String, Value>) -> tera::Result<Value> {
Ok(Value::String(uuid::Uuid::new_v4().to_string()))
}
}
struct FakeUuidSeededFunction;
impl Function for FakeUuidSeededFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
let seed = get_seed(args);
let uuid_bytes = format!("{:032x}", seed);
Ok(Value::String(format!(
"{}-{}-{}-{}-{}",
&uuid_bytes[0..8],
&uuid_bytes[8..12],
&uuid_bytes[12..16],
&uuid_bytes[16..20],
&uuid_bytes[20..32]
)))
}
}
struct FakeNameFunction;
impl Function for FakeNameFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::name::en::Name;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(Name().fake_with_rng(&mut rng)))
}
}
struct FakeFirstNameFunction;
impl Function for FakeFirstNameFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::name::en::FirstName;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(FirstName().fake_with_rng(&mut rng)))
}
}
struct FakeLastNameFunction;
impl Function for FakeLastNameFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::name::en::LastName;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(LastName().fake_with_rng(&mut rng)))
}
}
struct FakeTitleFunction;
impl Function for FakeTitleFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::name::en::Title;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(Title().fake_with_rng(&mut rng)))
}
}
struct FakeSuffixFunction;
impl Function for FakeSuffixFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::name::en::Suffix;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(Suffix().fake_with_rng(&mut rng)))
}
}
struct FakeEmailFunction;
impl Function for FakeEmailFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::internet::en::SafeEmail;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(SafeEmail().fake_with_rng(&mut rng)))
}
}
struct FakeUsernameFunction;
impl Function for FakeUsernameFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::internet::en::Username;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(Username().fake_with_rng(&mut rng)))
}
}
struct FakePasswordFunction;
impl Function for FakePasswordFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::internet::en::Password;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let min = args.get("min").and_then(|v| v.as_u64()).unwrap_or(8) as usize;
let max = args.get("max").and_then(|v| v.as_u64()).unwrap_or(20) as usize;
Ok(Value::String(Password(min..max).fake_with_rng(&mut rng)))
}
}
struct FakeDomainFunction;
impl Function for FakeDomainFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::internet::en::DomainSuffix;
use fake::faker::lorem::en::Word;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let word: String = Word().fake_with_rng(&mut rng);
let suffix: String = DomainSuffix().fake_with_rng(&mut rng);
Ok(Value::String(format!("{}.{}", word, suffix)))
}
}
struct FakeUrlFunction;
impl Function for FakeUrlFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::internet::en::DomainSuffix;
use fake::faker::lorem::en::Word;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let word: String = Word().fake_with_rng(&mut rng);
let suffix: String = DomainSuffix().fake_with_rng(&mut rng);
Ok(Value::String(format!("https://{}.{}", word, suffix)))
}
}
struct FakeIpv4Function;
impl Function for FakeIpv4Function {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::internet::en::IPv4;
use fake::Fake;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let ip: std::net::Ipv4Addr = IPv4().fake_with_rng::<std::net::Ipv4Addr, _>(&mut rng);
Ok(Value::String(ip.to_string()))
}
}
struct FakeIpv6Function;
impl Function for FakeIpv6Function {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::internet::en::IPv6;
use fake::Fake;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let ip: std::net::Ipv6Addr = IPv6().fake_with_rng::<std::net::Ipv6Addr, _>(&mut rng);
Ok(Value::String(ip.to_string()))
}
}
struct FakeUserAgentFunction;
impl Function for FakeUserAgentFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::internet::en::UserAgent;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(UserAgent().fake_with_rng(&mut rng)))
}
}
struct FakeMacAddressFunction;
impl Function for FakeMacAddressFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::internet::en::MACAddress;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(MACAddress().fake_with_rng(&mut rng)))
}
}
struct FakeStreetFunction;
impl Function for FakeStreetFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::address::en::StreetName;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(StreetName().fake_with_rng(&mut rng)))
}
}
struct FakeCityFunction;
impl Function for FakeCityFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::address::en::CityName;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(CityName().fake_with_rng(&mut rng)))
}
}
struct FakeStateFunction;
impl Function for FakeStateFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::address::en::StateName;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(StateName().fake_with_rng(&mut rng)))
}
}
struct FakeZipFunction;
impl Function for FakeZipFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::address::en::ZipCode;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(ZipCode().fake_with_rng(&mut rng)))
}
}
struct FakeCountryFunction;
impl Function for FakeCountryFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::address::en::CountryName;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(CountryName().fake_with_rng(&mut rng)))
}
}
struct FakeLatitudeFunction;
impl Function for FakeLatitudeFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::address::en::Latitude;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(Latitude().fake_with_rng(&mut rng)))
}
}
struct FakeLongitudeFunction;
impl Function for FakeLongitudeFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::address::en::Longitude;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(Longitude().fake_with_rng(&mut rng)))
}
}
struct FakePhoneFunction;
impl Function for FakePhoneFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::phone_number::en::PhoneNumber;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(PhoneNumber().fake_with_rng(&mut rng)))
}
}
struct FakeCellPhoneFunction;
impl Function for FakeCellPhoneFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::phone_number::en::CellNumber;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(CellNumber().fake_with_rng(&mut rng)))
}
}
struct FakeCompanyFunction;
impl Function for FakeCompanyFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::company::en::CompanyName;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(CompanyName().fake_with_rng(&mut rng)))
}
}
struct FakeCompanySuffixFunction;
impl Function for FakeCompanySuffixFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::company::en::CompanySuffix;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(CompanySuffix().fake_with_rng(&mut rng)))
}
}
struct FakeIndustryFunction;
impl Function for FakeIndustryFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::company::en::Industry;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(Industry().fake_with_rng(&mut rng)))
}
}
struct FakeProfessionFunction;
impl Function for FakeProfessionFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::company::en::Profession;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(Profession().fake_with_rng(&mut rng)))
}
}
struct FakeWordFunction;
impl Function for FakeWordFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::lorem::en::Word;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(Word().fake_with_rng(&mut rng)))
}
}
struct FakeWordsFunction;
impl Function for FakeWordsFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::lorem::en::Words;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let count = args.get("count").and_then(|v| v.as_u64()).unwrap_or(3) as usize;
let words: Vec<String> = Words(count..count + 1).fake_with_rng(&mut rng);
Ok(Value::String(words.join(" ")))
}
}
struct FakeSentenceFunction;
impl Function for FakeSentenceFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::lorem::en::Sentence;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let min = args.get("min").and_then(|v| v.as_u64()).unwrap_or(4) as usize;
let max = args.get("max").and_then(|v| v.as_u64()).unwrap_or(10) as usize;
Ok(Value::String(Sentence(min..max).fake_with_rng(&mut rng)))
}
}
struct FakeParagraphFunction;
impl Function for FakeParagraphFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::lorem::en::Paragraph;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let min = args.get("min").and_then(|v| v.as_u64()).unwrap_or(3) as usize;
let max = args.get("max").and_then(|v| v.as_u64()).unwrap_or(7) as usize;
Ok(Value::String(Paragraph(min..max).fake_with_rng(&mut rng)))
}
}
struct FakeIntFunction;
impl Function for FakeIntFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let value: i32 = (0..1000).fake_with_rng(&mut rng);
Ok(Value::Number(value.into()))
}
}
struct FakeIntRangeFunction;
impl Function for FakeIntRangeFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let min = args.get("min").and_then(|v| v.as_i64()).unwrap_or(0) as i32;
let max = args.get("max").and_then(|v| v.as_i64()).unwrap_or(100) as i32;
let value: i32 = (min..max).fake_with_rng(&mut rng);
Ok(Value::Number(value.into()))
}
}
struct FakeFloatFunction;
impl Function for FakeFloatFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let value: f64 = (0.0..1000.0).fake_with_rng(&mut rng);
Ok(Value::Number(
serde_json::Number::from_f64(value).unwrap_or(serde_json::Number::from(0)),
))
}
}
struct FakeBoolFunction;
impl Function for FakeBoolFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::boolean::en::Boolean;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let ratio = args.get("ratio").and_then(|v| v.as_u64()).unwrap_or(50) as u8;
Ok(Value::Bool(Boolean(ratio).fake_with_rng(&mut rng)))
}
}
struct FakeDateFunction;
impl Function for FakeDateFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::chrono::en::Date;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let date: chrono::NaiveDate = Date().fake_with_rng(&mut rng);
Ok(Value::String(date.to_string()))
}
}
struct FakeTimeFunction;
impl Function for FakeTimeFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::chrono::en::Time;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let time: chrono::NaiveTime = Time().fake_with_rng(&mut rng);
Ok(Value::String(time.to_string()))
}
}
struct FakeDateTimeFunction;
impl Function for FakeDateTimeFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::chrono::en::DateTime;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let dt: chrono::DateTime<chrono::Utc> = DateTime().fake_with_rng(&mut rng);
Ok(Value::String(dt.to_rfc3339()))
}
}
struct FakeTimestampFunction;
impl Function for FakeTimestampFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::chrono::en::DateTime;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let dt: chrono::DateTime<chrono::Utc> = DateTime().fake_with_rng(&mut rng);
Ok(Value::Number(dt.timestamp().into()))
}
}
struct FakeCreditCardFunction;
impl Function for FakeCreditCardFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::creditcard::en::CreditCardNumber;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(CreditCardNumber().fake_with_rng(&mut rng)))
}
}
struct FakeCurrencyCodeFunction;
impl Function for FakeCurrencyCodeFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::currency::en::CurrencyCode;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(CurrencyCode().fake_with_rng(&mut rng)))
}
}
struct FakeCurrencyNameFunction;
impl Function for FakeCurrencyNameFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::currency::en::CurrencyName;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(CurrencyName().fake_with_rng(&mut rng)))
}
}
struct FakeCurrencySymbolFunction;
impl Function for FakeCurrencySymbolFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::currency::en::CurrencySymbol;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(CurrencySymbol().fake_with_rng(&mut rng)))
}
}
struct FakeFilenameFunction;
impl Function for FakeFilenameFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::filesystem::en::FileName;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(FileName().fake_with_rng(&mut rng)))
}
}
struct FakeExtensionFunction;
impl Function for FakeExtensionFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::filesystem::en::FileExtension;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(FileExtension().fake_with_rng(&mut rng)))
}
}
struct FakeMimeTypeFunction;
impl Function for FakeMimeTypeFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::filesystem::en::MimeType;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(MimeType().fake_with_rng(&mut rng)))
}
}
struct FakeFilePathFunction;
impl Function for FakeFilePathFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::filesystem::en::FilePath;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(FilePath().fake_with_rng(&mut rng)))
}
}
struct FakeColorFunction;
impl Function for FakeColorFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::color::en::Color;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(Color().fake_with_rng(&mut rng)))
}
}
struct FakeHexColorFunction;
impl Function for FakeHexColorFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::color::en::HexColor;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(HexColor().fake_with_rng(&mut rng)))
}
}
struct FakeRgbColorFunction;
impl Function for FakeRgbColorFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use fake::faker::color::en::RgbColor;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
Ok(Value::String(RgbColor().fake_with_rng(&mut rng)))
}
}
struct FakeStringFunction;
impl Function for FakeStringFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
use rand::Rng;
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let len = args.get("len").and_then(|v| v.as_u64()).unwrap_or(10) as usize;
let s: String = (0..len)
.map(|_| rng.gen_range(b'a'..=b'z') as char)
.collect();
Ok(Value::String(s))
}
}
struct FakePortFunction;
impl Function for FakePortFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let port: u16 = (1024..65535).fake_with_rng(&mut rng);
Ok(Value::Number(port.into()))
}
}
struct FakeSemverFunction;
impl Function for FakeSemverFunction {
fn call(&self, args: &HashMap<String, Value>) -> tera::Result<Value> {
let seed = get_seed(args);
let mut rng = StdRng::seed_from_u64(seed);
let major: u8 = (0..10).fake_with_rng(&mut rng);
let minor: u8 = (0..20).fake_with_rng(&mut rng);
let patch: u8 = (0..100).fake_with_rng(&mut rng);
Ok(Value::String(format!("{}.{}.{}", major, minor, patch)))
}
}