GitRoot

craft your forge, build your project, grow your community freely
  1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
  2//
  3// SPDX-License-Identifier: EUPL-1.2
  4
  5#![no_main]
  6
  7use gitroot_plugin_sdk::{Commit, Exec, Plugin, PluginExecRight, PluginRun, Server};
  8use gitroot_plugin_sdk::{PluginRunWhen, PluginWrite};
  9
 10pub use gitroot_plugin_sdk::exports::*;
 11pub use gitroot_plugin_sdk::imports::*;
 12use serde::{Deserialize, Serialize};
 13use std::cell::RefCell;
 14
 15struct Hop {
 16    server: &'static Server,
 17    conf: RefCell<Option<Conf>>,
 18}
 19
 20impl Hop {
 21    fn new(server: &'static Server) -> Self {
 22        Self {
 23            server: server,
 24            conf: RefCell::new(None),
 25        }
 26    }
 27}
 28
 29#[derive(Serialize, Deserialize)]
 30struct Conf {
 31    exec: Vec<Exec>,
 32}
 33
 34impl Plugin for Hop {
 35    fn init(
 36        &self,
 37        repo_name: String,
 38        conf_has_changed: bool,
 39        serialized_conf: String,
 40    ) -> Result<(), String> {
 41        return serde_json::from_str(serialized_conf.as_str())
 42            .map(|conf: Conf| *self.conf.borrow_mut() = Some(conf))
 43            .map_err(|err| err.to_string());
 44    }
 45
 46    fn start_commit(&self, commit: Commit) -> Result<(), String> {
 47        Ok(())
 48    }
 49
 50    fn add_file(&self, path: String) -> Result<(), String> {
 51        Ok(())
 52    }
 53
 54    fn mod_file(&self, from_path: String, to_path: String) -> Result<(), String> {
 55        Ok(())
 56    }
 57
 58    fn del_file(&self, path: String) -> Result<(), String> {
 59        Ok(())
 60    }
 61
 62    fn end_commit(&self, commit: Commit) -> Result<(), String> {
 63        Ok(())
 64    }
 65
 66    fn finish(&self) -> Result<(), String> {
 67        let conf_guard = self.conf.borrow();
 68        let conf = conf_guard.as_ref().unwrap();
 69        let _ = self.server.exec(&conf.exec).map(|log| {
 70            log.split("\n")
 71                .for_each(|l| self.server.log(format!("Exec > {}", l.to_string())));
 72        });
 73        Ok(())
 74    }
 75}
 76
 77#[cfg_attr(all(target_arch = "wasm32"), unsafe(export_name = "install"))]
 78pub extern "C" fn install() {
 79    let conf = PluginRun {
 80        path: String::from("*"),
 81        branch: vec![String::from("main")],
 82        when: vec![PluginRunWhen::ADD, PluginRunWhen::MOD],
 83        write: PluginWrite {
 84            git: vec![],
 85            web: vec![],
 86            exec: vec![PluginExecRight {
 87                command: String::from("cat"),
 88            }],
 89        },
 90        configuration: serde_json::to_value(Conf {
 91            exec: vec![Exec {
 92                cmd: String::from("cat"),
 93                args: vec![String::from("README.md")],
 94                env: vec![],
 95            }],
 96        })
 97        .unwrap(),
 98    };
 99    Server::init(vec![conf], |server| Hop::new(server));
100}