Skip to content

Instantly share code, notes, and snippets.

Created December 13, 2016 12:05
Show Gist options
  • Save anonymous/ad12c2e4f3ba1f90cc6addc1fb2348ce to your computer and use it in GitHub Desktop.
Save anonymous/ad12c2e4f3ba1f90cc6addc1fb2348ce to your computer and use it in GitHub Desktop.
use cpython::{PyResult, Python, PyObject, ObjectProtocol, PyErr, exc};
py_module_initializer!(fastdtparse, initfastdtparse, PyInit_fastdtparse, |py, m| {
try!(m.add(py, "__doc__", "This module is implemented in Rust."));
try!(m.add(py, "parse_isoformat", py_fn!(py, parse_isoformat_py(datestr: &str))));
Ok(())
});
fn parse_isoformat(datestr: &str) -> Result<(i32, u8, u8, u8, u8, u8), &'static str> {
if datestr.len() < 19 {
return Err("string is too short");
}
let year_str = &datestr[..4];
let month_str = &datestr[5..7];
let day_str = &datestr[8..10];
let hour_str = &datestr[11..13];
let minute_str = &datestr[14..16];
let second_str = &datestr[17..19];
let year = year_str.parse().map_err(|_| "year is not an integer")?;
let month = month_str.parse().map_err(|_| "month is not integer")?;
let day = day_str.parse().map_err(|_| "day is not integer")?;
let hour = hour_str.parse().map_err(|_| "hour is not integer")?;
let minute = minute_str.parse().map_err(|_| "minute is not integer")?;
let second = second_str.parse().map_err(|_| "second is not integer")?;
Ok((year, month, day, hour, minute, second))
}
pub fn parse_isoformat_py(py: Python, datestr: &str) -> PyResult<PyObject> {
let dt_mod = try!(py.import("datetime"));
let dt_dt = try!(dt_mod.get(py, "datetime"));
let args = try!(parse_isoformat(datestr).map_err(|e| PyErr::new::<exc::ValueError, &str>(py, e)));
try!(dt_dt.call(py, args, None)).extract(py)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment