roder_ext_chrome/
extension.rs1use std::sync::Arc;
2
3use roder_api::capabilities::CapabilityRequest;
4use roder_api::extension::{
5 ExtensionManifest, ExtensionRegistryBuilder, ProvidedService, RoderExtension,
6};
7use semver::Version;
8
9use crate::tools::ChromeToolContributor;
10
11pub struct ChromeExtension;
14
15impl ChromeExtension {
16 pub fn new() -> Self {
17 Self
18 }
19}
20
21impl Default for ChromeExtension {
22 fn default() -> Self {
23 Self::new()
24 }
25}
26
27impl RoderExtension for ChromeExtension {
28 fn manifest(&self) -> ExtensionManifest {
29 ExtensionManifest {
30 id: "roder-ext-chrome".to_string(),
31 name: "Chrome Browser Control".to_string(),
32 version: Version::new(0, 1, 0),
33 api_version: "0.1.0".to_string(),
34 description: Some(
35 "Inspect, control, debug, and record the user's live Chrome session through the \
36 Roder browser extension bridge."
37 .to_string(),
38 ),
39 provides: vec![ProvidedService::ToolProvider("chrome".to_string())],
40 required_capabilities: vec![
41 CapabilityRequest::new("network.web"),
42 CapabilityRequest::new("fs.readwrite.roder-home"),
43 ],
44 }
45 }
46
47 fn install(&self, registry: &mut ExtensionRegistryBuilder) -> anyhow::Result<()> {
48 registry.tool_contributor(Arc::new(ChromeToolContributor::new()));
49 Ok(())
50 }
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56
57 #[test]
58 fn manifest_provides_chrome_tools() {
59 let manifest = ChromeExtension.manifest();
60 assert!(
61 manifest
62 .provides
63 .contains(&ProvidedService::ToolProvider("chrome".to_string()))
64 );
65 }
66
67 #[test]
68 fn extension_installs_into_registry() {
69 let mut builder = ExtensionRegistryBuilder::new();
70 builder.install(ChromeExtension::new()).expect("install");
71 let registry = builder.build().expect("build");
72 assert!(
73 registry
74 .provided_services()
75 .contains(&ProvidedService::ToolProvider("chrome".to_string()))
76 );
77 }
78}