GitRoot
craft your forge, build your project, grow your community freely
1// SPDX-FileCopyrightText: 2026 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5#![no_main]
6
7use gitroot_plugin_sdk::{
8 register, Commit, File, Plugin, PluginFunc, PluginRun, PluginWrite, Server,
9};
10
11pub use gitroot_plugin_sdk::exports::*;
12pub use gitroot_plugin_sdk::imports::*;
13use mermaid_rs_renderer::render_with_options;
14use mermaid_rs_renderer::RenderOptions;
15use serde::{Deserialize, Serialize};
16use std::collections::HashMap;
17use std::sync::Arc;
18
19use mermaid_rs_renderer::render;
20
21struct ApexMermaid {}
22
23impl ApexMermaid {
24 fn new(server: Arc<Server>) -> Self {
25 server.export_func("renderCode", |args| {
26 if let Some(value) = args.get("code") {
27 let mut opts = RenderOptions::modern();
28 opts.theme.background = "transparent".to_string();
29 render_with_options(value, opts)
30 .map(|svg| HashMap::from([("html".to_string(), svg)]))
31 .map_err(|err| err.to_string())
32 } else {
33 Ok(HashMap::new())
34 }
35 });
36 Self {}
37 }
38}
39
40#[derive(Serialize, Deserialize)]
41struct Conf {}
42
43impl Plugin for ApexMermaid {
44 fn init(
45 &self,
46 _repo_name: String,
47 _conf_has_changed: bool,
48 _serialized_conf: String,
49 ) -> Result<(), String> {
50 Ok(())
51 }
52
53 fn start_commit(&self, _commit: Commit) -> Result<(), String> {
54 Ok(())
55 }
56
57 fn add_file(&self, _file: File) -> Result<(), String> {
58 Ok(())
59 }
60
61 fn mod_file(&self, _file: File) -> Result<(), String> {
62 Ok(())
63 }
64
65 fn del_file(&self, _file: File) -> Result<(), String> {
66 Ok(())
67 }
68
69 fn end_commit(&self, _commit: Commit) -> Result<(), String> {
70 Ok(())
71 }
72
73 fn finish(&self) -> Result<(), String> {
74 Ok(())
75 }
76}
77
78#[cfg_attr(all(target_arch = "wasm32"), unsafe(export_name = "install"))]
79pub extern "C" fn install() {
80 let conf = PluginRun {
81 path: String::from(""),
82 branch: vec![],
83 when: vec![],
84 func: vec![PluginFunc {
85 func_name: "renderCode".to_string(),
86 args: vec!["code".to_string()],
87 res: vec!["html".to_string()],
88 }],
89 write: PluginWrite {
90 git: vec![],
91 web: vec![],
92 exec: vec![],
93 call_func: vec![],
94 },
95 configuration: serde_json::to_value(Conf {}).unwrap(),
96 };
97 register(vec![conf], ApexMermaid::new);
98}