mirror of
https://github.com/storytold/designcraft.git
synced 2026-10-26 03:06:56 -06:00
56 lines
1.7 KiB
Rust
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());
|
|
}
|
|
}
|
|
}
|