#![doc(html_root_url = "https://docs.rs/nematic/0.0.1")]
pub mod feed;
pub mod file;
pub mod finger;
pub mod gemtext;
pub mod gopher;
pub mod guppy;
pub mod knot;
#[cfg(feature = "views")]
pub mod views;
pub mod markdown;
pub mod misfin;
pub mod nex;
pub mod scroll;
pub mod spartan;
pub mod text;
pub mod titan;
pub use feed::{ENGINE_ID as ENGINE_FEED, FeedEngine};
pub use file::{ENGINE_ID as ENGINE_FILE, FileEngine};
pub use finger::{ENGINE_ID as ENGINE_FINGER, FingerEngine};
pub use gemtext::{ENGINE_ID as ENGINE_GEMTEXT, GemtextEngine};
pub use gopher::{ENGINE_ID as ENGINE_GOPHER, GopherEngine};
pub use guppy::{ENGINE_ID as ENGINE_GUPPY, GuppyEngine};
pub use knot::{ENGINE_ID as ENGINE_KNOT, KnotEngine};
pub use knot::djot::{DjotKnotEngine, ENGINE_ID as ENGINE_KNOT_DJOT};
pub use markdown::{ENGINE_ID as ENGINE_MARKDOWN, MarkdownEngine};
pub use misfin::{ENGINE_ID as ENGINE_MISFIN, MisfinEngine};
pub use nex::{ENGINE_ID as ENGINE_NEX, NexEngine};
pub use scroll::{ENGINE_ID as ENGINE_SCROLL, ScrollEngine};
pub use spartan::{ENGINE_ID as ENGINE_SPARTAN, SpartanEngine};
pub use text::{ENGINE_ID as ENGINE_TEXT, TextEngine};
pub use titan::{ENGINE_ID as ENGINE_TITAN, TitanEngine};
use inker::Engine;
pub fn engines() -> Vec<Box<dyn Engine>> {
vec![
Box::new(MarkdownEngine::new()),
Box::new(GemtextEngine::new()),
Box::new(GopherEngine::new()),
Box::new(FeedEngine::new()),
Box::new(TextEngine::new()),
Box::new(FileEngine::new()),
Box::new(FingerEngine::new()),
Box::new(KnotEngine::new()),
Box::new(DjotKnotEngine::new()),
Box::new(ScrollEngine::new()),
Box::new(SpartanEngine::new()),
Box::new(TitanEngine::new()),
Box::new(MisfinEngine::new()),
Box::new(NexEngine::new()),
Box::new(GuppyEngine::new()),
]
}
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
pub const STAGE: &str = "pre-alpha";
#[cfg(test)]
mod tests {
use super::*;
use inker::routing::{
EngineRouteDecision, SurfaceContract, SurfaceContractMode, SurfaceTargetId,
};
use inker::{EngineInput, EngineRegistry};
fn decision(engine_id: &str) -> EngineRouteDecision {
EngineRouteDecision {
engine_id: engine_id.to_string(),
surface_contract: SurfaceContract {
target: SurfaceTargetId::new("test:1"),
mode: SurfaceContractMode::Headless,
},
}
}
#[test]
fn engines_helper_registers_all_default_engines() {
let mut registry = EngineRegistry::new();
for engine in engines() {
registry.register(engine);
}
let mut ids: Vec<&str> = registry.engine_ids().collect();
ids.sort();
assert_eq!(
ids,
vec![
ENGINE_FEED,
ENGINE_FILE,
ENGINE_FINGER,
ENGINE_GEMTEXT,
ENGINE_GOPHER,
ENGINE_GUPPY,
ENGINE_KNOT,
ENGINE_KNOT_DJOT,
ENGINE_MARKDOWN,
ENGINE_MISFIN,
ENGINE_NEX,
ENGINE_SCROLL,
ENGINE_SPARTAN,
ENGINE_TEXT,
ENGINE_TITAN
]
);
}
#[test]
fn end_to_end_routing_with_default_policy_dispatches_to_gemtext() {
use inker::routing::{EngineRoutePolicy, EngineRouteRequest, WorkspaceRouteId};
let policy = EngineRoutePolicy::default();
let request = EngineRouteRequest {
workspace_id: WorkspaceRouteId::new("main"),
view: None,
node: None,
address: "gemini://capsule.test/".to_string(),
content_type: None,
pinned_engine: None,
};
let decision = policy.route(&request);
let mut registry = EngineRegistry::new();
for engine in engines() {
registry.register(engine);
}
let doc = registry
.dispatch(
&decision,
&EngineInput::new("gemini://capsule.test/", "# Hello\n\ntext"),
)
.expect("dispatch");
assert_eq!(doc.title.as_deref(), Some("Hello"));
assert_eq!(decision.engine_id, ENGINE_GEMTEXT);
}
#[test]
fn engines_helper_can_dispatch_each_id() {
let mut registry = EngineRegistry::new();
for engine in engines() {
registry.register(engine);
}
for id in [
ENGINE_MARKDOWN,
ENGINE_GEMTEXT,
ENGINE_GOPHER,
ENGINE_TEXT,
ENGINE_FILE,
ENGINE_FINGER,
ENGINE_KNOT,
ENGINE_SCROLL,
ENGINE_MISFIN,
ENGINE_GUPPY,
] {
let result = registry.dispatch(&decision(id), &EngineInput::new("a:b", "hi"));
assert!(result.is_ok(), "dispatch for {id} failed: {result:?}");
}
let result = registry.dispatch(
&decision(ENGINE_FEED),
&EngineInput::new(
"feed:1",
r#"<?xml version="1.0"?><rss version="2.0"><channel/></rss>"#,
),
);
assert!(
result.is_ok(),
"dispatch for {ENGINE_FEED} failed: {result:?}"
);
}
}