roezio: Add Python bindings to logs parsing
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
This commit is contained in:
parent
5346e88840
commit
c68b00ae24
1 changed files with 47 additions and 0 deletions
47
src/lib.rs
47
src/lib.rs
|
@ -1,13 +1,16 @@
|
||||||
mod logger;
|
mod logger;
|
||||||
mod theming;
|
mod theming;
|
||||||
|
|
||||||
|
use crate::logger::LogItem;
|
||||||
use crate::theming::{curses_attr, parse_attrs};
|
use crate::theming::{curses_attr, parse_attrs};
|
||||||
|
|
||||||
|
use chrono::{Datelike, Timelike};
|
||||||
use pyo3::{
|
use pyo3::{
|
||||||
conversion::{IntoPy, ToPyObject},
|
conversion::{IntoPy, ToPyObject},
|
||||||
create_exception,
|
create_exception,
|
||||||
marker::Python,
|
marker::Python,
|
||||||
prelude::{pyfunction, pymodule, wrap_pyfunction, PyErr, PyModule, PyObject, PyResult},
|
prelude::{pyfunction, pymodule, wrap_pyfunction, PyErr, PyModule, PyObject, PyResult},
|
||||||
|
types::{PyDateTime, PyDict},
|
||||||
};
|
};
|
||||||
|
|
||||||
create_exception!(libpoezio, LogParseError, pyo3::exceptions::PyException);
|
create_exception!(libpoezio, LogParseError, pyo3::exceptions::PyException);
|
||||||
|
@ -16,6 +19,7 @@ create_exception!(libpoezio, LogParseError, pyo3::exceptions::PyException);
|
||||||
fn libpoezio(py: Python, m: &PyModule) -> PyResult<()> {
|
fn libpoezio(py: Python, m: &PyModule) -> PyResult<()> {
|
||||||
m.add("LogParseError", py.get_type::<LogParseError>())?;
|
m.add("LogParseError", py.get_type::<LogParseError>())?;
|
||||||
m.add_function(wrap_pyfunction!(to_curses_attr, m)?)?;
|
m.add_function(wrap_pyfunction!(to_curses_attr, m)?)?;
|
||||||
|
m.add_function(wrap_pyfunction!(parse_logs, m)?)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -39,3 +43,46 @@ fn to_curses_attr(py: Python, fg: i16, bg: i16, attrs: &str) -> PyResult<PyObjec
|
||||||
let result = curses_attr(fg, bg, attrs);
|
let result = curses_attr(fg, bg, attrs);
|
||||||
Ok(py_object!(py, result))
|
Ok(py_object!(py, result))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn chrono_to_datetime(py: Python, chrono: &chrono::DateTime<chrono::Utc>) -> PyResult<PyObject> {
|
||||||
|
let datetime = PyDateTime::new(
|
||||||
|
py,
|
||||||
|
chrono.year(),
|
||||||
|
chrono.month() as u8,
|
||||||
|
chrono.day() as u8,
|
||||||
|
chrono.hour() as u8,
|
||||||
|
chrono.minute() as u8,
|
||||||
|
chrono.second() as u8,
|
||||||
|
0,
|
||||||
|
None,
|
||||||
|
)?;
|
||||||
|
Ok(datetime.to_object(py))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[pyfunction]
|
||||||
|
fn parse_logs(py: Python, input: &str) -> PyResult<PyObject> {
|
||||||
|
let logs = match logger::parse_logs(input) {
|
||||||
|
Ok((_, logs)) => logs,
|
||||||
|
Err(err) => return Err(nom_to_py_err(py, err)),
|
||||||
|
};
|
||||||
|
let mut items = Vec::new();
|
||||||
|
for item in logs {
|
||||||
|
let dict = PyDict::new(py);
|
||||||
|
let (time, txt) = match item {
|
||||||
|
logger::Item::Message(message) => {
|
||||||
|
let time = chrono_to_datetime(py, message.get_time())?;
|
||||||
|
dict.set_item("nickname", message.get_nick())?;
|
||||||
|
(time, message.get_message())
|
||||||
|
}
|
||||||
|
logger::Item::Info(info) => {
|
||||||
|
let time = chrono_to_datetime(py, info.get_time())?;
|
||||||
|
(time, info.get_message())
|
||||||
|
}
|
||||||
|
};
|
||||||
|
dict.set_item("history", true)?;
|
||||||
|
dict.set_item("time", time)?;
|
||||||
|
dict.set_item("txt", txt)?;
|
||||||
|
items.push(dict);
|
||||||
|
}
|
||||||
|
Ok(items.into_py(py).to_object(py))
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue