papyri/
lib.rs

1/*Copyright (c) 2022 Diego da Silva Lima. All rights reserved.
2
3This work is licensed under the terms of the MIT license.  
4For a copy, see <https://opensource.org/licenses/MIT>.*/
5
6// Perhaps rename to spec?
7pub 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    // use std::os::raw::c_char;
20
21    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