1pub mod model;
8
9#[cfg(feature="gdk4")]
10#[cfg(feature="gdk-pixbuf")]
11#[cfg(feature="cairo-rs")]
12pub mod render;
13
14#[cfg(feature="gdk4")]
15#[cfg(feature="gdk-pixbuf")]
16#[cfg(feature="cairo-rs")]
17pub mod ffi {
18
19 const INVALID_UTF8 : i64 = 1;
22
23 const INSUFFICIENT_LEN : i64 = 2;
24
25 const INVALID_DEFINITION : i64 = 3;
26
27 #[no_mangle]
28 pub extern "C" fn papyri_error(code : i64, out : *mut u8, out_len : &mut usize) -> i64 {
29 let out = unsafe { std::slice::from_raw_parts_mut(out, *out_len) };
30 let msg = match code {
31 INVALID_UTF8 => "Invalid UTF-8",
32 INSUFFICIENT_LEN => "Insufficient length",
33 _ => "Unknown error"
34 };
35 if let Some(s) = out.get_mut(..msg.len()) {
36 s.copy_from_slice(msg.as_bytes());
37 *out_len = s.len();
38 0
39 } else {
40 -1
41 }
42 }
43
44 #[no_mangle]
45 pub extern "C" fn papyri_svg(model : *const u8, model_len : usize, out : *mut u8, out_len : &mut usize) -> i64 {
46 let model = unsafe { std::slice::from_raw_parts(model, model_len) };
47 match std::str::from_utf8(model) {
48 Ok(s) => {
49 match crate::render::Panel::new_from_json(s) {
50 Ok(mut pl) => {
51 match pl.svg() {
52 Ok(svg) => {
53 let out = unsafe { std::slice::from_raw_parts_mut(out, *out_len) };
54 match out.get_mut(..svg.len()) {
55 Some(s) => {
56 s.copy_from_slice(svg.as_bytes());
57 *out_len = s.len();
58 0
59 },
60 None => {
61 INSUFFICIENT_LEN
62 }
63 }
64 },
65 Err(_) => {
66 INVALID_DEFINITION
67 }
68 }
69 },
70 Err(_) => {
71 INVALID_DEFINITION
72 }
73 }
74 },
75 Err(_) => {
76 INVALID_UTF8
77 }
78 }
79 }
80
81}
82