Files
designcraft/crates/engine/src/links.rs
T

56 lines
1.7 KiB
Rust

//! ArtCraft community and project links (Help menu, About, start screen, CLI, MCP).
use serde_json::{Value, json};
/// The app's slug on getartcraft.com and GitHub.
pub const APP: &str = "designcraft";
/// The ArtCraft community Discord.
pub const DISCORD: &str = "https://discord.gg/artcraft";
/// The ArtCraft website.
pub const WEBSITE: &str = "https://getartcraft.com";
/// DesignCraft's page on the ArtCraft website.
pub const APP_PAGE: &str = "https://getartcraft.com/apps/designcraft";
/// DesignCraft's source repository.
pub const GITHUB: &str = "https://github.com/storytold/designcraft";
/// Where to report bugs and request features.
pub const ISSUES: &str = "https://github.com/storytold/designcraft/issues";
/// All links as JSON (the `app.links` command).
pub fn all() -> Value {
json!({
"discord": DISCORD,
"website": WEBSITE,
"appPage": APP_PAGE,
"github": GITHUB,
"issues": ISSUES,
})
}
/// A link by key (`discord`, `website`, `appPage`, `github`, `issues`).
pub fn get(key: &str) -> Option<&'static str> {
Some(match key {
"discord" => DISCORD,
"website" => WEBSITE,
"appPage" => APP_PAGE,
"github" => GITHUB,
"issues" => ISSUES,
_ => return None,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn links_follow_the_app_slug() {
assert!(APP_PAGE.ends_with(&format!("/apps/{APP}")));
assert!(GITHUB.ends_with(&format!("/storytold/{APP}")));
assert!(ISSUES.starts_with(GITHUB));
for k in ["discord", "website", "appPage", "github", "issues"] {
assert!(get(k).is_some_and(|u| u.starts_with("https://")), "{k}");
assert_eq!(all()[k], get(k).unwrap());
}
}
}