use crate::prelude::{Rc, String, Vec};
use core::fmt::Debug;
#[cfg(feature = "std")]
mod std_impl;
#[cfg(feature = "std")]
pub use std_impl::{StdConsoleProvider, StdRandomProvider, StdTimeProvider};
#[cfg(feature = "regex")]
pub use std_impl::FancyRegexProvider;
pub trait TimeProvider {
fn now_millis(&self) -> i64;
fn elapsed_millis(&self, start: u64) -> u64;
fn start_timer(&self) -> u64;
}
pub trait RandomProvider {
fn random(&mut self) -> f64;
}
pub struct NoOpTimeProvider;
impl TimeProvider for NoOpTimeProvider {
fn now_millis(&self) -> i64 {
0
}
fn elapsed_millis(&self, _start: u64) -> u64 {
0
}
fn start_timer(&self) -> u64 {
0
}
}
pub struct NoOpRandomProvider;
impl RandomProvider for NoOpRandomProvider {
fn random(&mut self) -> f64 {
0.5
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConsoleLevel {
Log,
Info,
Debug,
Warn,
Error,
}
pub trait ConsoleProvider {
fn write(&self, level: ConsoleLevel, message: &str);
fn clear(&self) {}
}
pub struct NoOpConsoleProvider;
impl ConsoleProvider for NoOpConsoleProvider {
fn write(&self, _level: ConsoleLevel, _message: &str) {
}
}
#[derive(Debug, Clone)]
pub struct RegexMatch {
pub start: usize,
pub end: usize,
pub captures: Vec<Option<(usize, usize)>>,
}
pub trait CompiledRegex: Debug {
fn is_match(&self, input: &str) -> Result<bool, String>;
fn find(&self, input: &str, start_pos: usize) -> Result<Option<RegexMatch>, String>;
fn find_iter(&self, input: &str) -> Result<Vec<RegexMatch>, String>;
fn split(&self, input: &str) -> Result<Vec<String>, String>;
fn replace(&self, input: &str, replacement: &str) -> Result<String, String>;
fn replace_all(&self, input: &str, replacement: &str) -> Result<String, String>;
}
pub trait RegExpProvider {
fn compile(&self, pattern: &str, flags: &str) -> Result<Rc<dyn CompiledRegex>, String>;
}
pub struct NoOpRegExpProvider;
impl RegExpProvider for NoOpRegExpProvider {
fn compile(&self, _pattern: &str, _flags: &str) -> Result<Rc<dyn CompiledRegex>, String> {
Err(
"RegExp not available: enable 'regex' feature or provide a custom RegExpProvider"
.into(),
)
}
}