First commit

This commit is contained in:
Joakim Nylén
2019-04-11 23:39:59 +02:00
commit a6776fdca8
14 changed files with 694 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
#[macro_use] extern crate rustler;
#[macro_use] extern crate rustler_codegen;
#[macro_use] extern crate lazy_static;
extern crate calamine;
use rustler::{Env, NifResult, Encoder, Term};
use calamine::{Reader, open_workbook_auto};
use calamine::Error as CaError;
mod atoms {
rustler_atoms! {
atom ok;
atom error;
// Posix
atom enoent; // File does not exist
atom eacces; // Permission denied
atom epipe; // Broken pipe
atom eexist; // File exists
}
}
rustler_export_nifs! {
"Elixir.Xler.Native",
[("parse", 2, parse),
("worksheets", 1, worksheets)],
None
}
fn io_error_to_term<'a>(env: Env<'a>, err: &CaError) -> Term<'a> {
let error = match err {
_ => format!("{}", err).encode(env),
};
(atoms::error(), error).encode(env)
}
fn worksheets<'a>(env: Env<'a>, args: &[Term<'a>]) -> NifResult<Term<'a>> {
let filename: String = args[0].decode()?;
match open_workbook_auto(&filename) {
Err(ref error) => return Ok(io_error_to_term(env, error)),
Ok(ref inner) => Ok((atoms::ok(), inner.sheet_names().to_owned()).encode(env)),
}
}
fn parse<'a>(env: Env<'a>, args: &[Term<'a>]) -> NifResult<Term<'a>> {
let filename: String = try!(args[0].decode());
let sheetname: String = try!(args[1].decode());
let mut excel = match open_workbook_auto(&filename) {
Err(ref error) => return Ok(io_error_to_term(env, error)),
Ok(inner) => inner,
};
if let Some(Ok(range)) = excel.worksheet_range(&sheetname) {
let row: Vec<(Vec<String>)> = range
.rows()
.into_iter()
.enumerate()
.map(|(_i, col)|
col
.iter()
.map(|c|
c.to_string()
)
.collect::<Vec<_>>()
)
.collect::<Vec<_>>();
Ok((atoms::ok(), row.encode(env)).encode(env))
} else {
Ok((atoms::error(), "Couldnt find the worksheet").encode(env))
}
}