use pyo3::prelude::*;
fn isidentifier_to_py(input: impl AsRef<str>, py: Python<'_>) -> PyResult<PyObject> {
let pymodule_code = include_str!("__init__.py");
let pymodule = PyModule::from_code_bound(py, pymodule_code, "__init__.py", "isidentifier")?;
let t = pymodule.getattr("isidentifier")?;
assert!(t.is_callable());
let args = (input.as_ref(),);
let isidentifier = t.call1(args)?;
Ok(isidentifier.into())
}
fn isidentifier(input: impl AsRef<str>) -> PyResult<bool> {
let isidentifier = Python::with_gil(|py| {
let isidentifier = isidentifier_to_py(input, py)?;
isidentifier.extract(py)
})?;
Ok(isidentifier)
}
pub trait IsIdentifier: AsRef<str> {
fn isidentifier(&self) -> PyResult<bool> {
let s = self.as_ref();
isidentifier(s)
}
}
impl<T: AsRef<str>> IsIdentifier for T {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn good_symbol_works() {
assert_eq!(isidentifier("alpha").unwrap(), true)
}
#[test]
fn good_symbol_works_as_method() {
assert_eq!(isidentifier("alpha").unwrap(), true)
}
#[test]
fn bad_symbol_works() {
assert_eq!(isidentifier("0alpha").unwrap(), false)
}
#[test]
fn bad_symbol_works_as_method() {
assert_eq!("0alpha".isidentifier().unwrap(), false)
}
}