ctoolbox/workspace/ipc/services/network/
api.rs

1//! Thin IPC-facing Network service adapter.
2//!
3//! This module defines a minimal `NetworkService` trait and postcard-encoded
4//! request/response types for the "network" IPC service. Implementations should
5//! delegate to `crate::network::NetworkBackend` (or similar), keeping business
6//! logic out of IPC.
7
8use anyhow::Result;
9use async_trait::async_trait;
10use serde::{Deserialize, Serialize};
11
12use crate::network::NetworkBackend;
13
14/// Service name used for routing and authorization.
15pub const SERVICE_NAME: &str = "network";
16
17/// Method identifiers supported by the network service.
18pub const METHOD_FETCH: &str = "fetch";
19pub const METHOD_READ_FILE: &str = "read_file";
20
21/// Request payloads (postcard-encoded).
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct FetchRequest {
24    pub url: String,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct ReadFileRequest {
29    pub path: String,
30}
31
32/// Response payloads (postcard-encoded).
33#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct BytesResponse {
35    /// Raw bytes result.
36    pub bytes: Vec<u8>,
37}
38
39/// IPC-facing network service trait. Methods mirror `crate::network` APIs.
40///
41#[async_trait]
42pub trait NetworkService: Send + Sync + std::fmt::Debug {
43    /// Fetch bytes from a URL (http/https).
44    ///
45    /// Delegates to the underlying networking backend.
46    async fn fetch(&self, req: FetchRequest) -> Result<BytesResponse>;
47
48    /// Read a local file into memory.
49    ///
50    /// Delegates to the underlying networking backend.
51    async fn read_file(&self, req: ReadFileRequest) -> Result<BytesResponse>;
52}
53
54/// Default network service using `DefaultNetworkBackend`.
55#[derive(Debug, Default)]
56pub struct DefaultNetworkService {
57    backend: crate::network::DefaultNetworkBackend,
58}
59
60impl DefaultNetworkService {
61    /// Create a new default network service.
62    pub fn new() -> Self {
63        Self::default()
64    }
65}
66
67#[async_trait]
68impl NetworkService for DefaultNetworkService {
69    async fn fetch(&self, req: FetchRequest) -> Result<BytesResponse> {
70        let bytes = self.backend.fetch(req.url).await?;
71        Ok(BytesResponse { bytes })
72    }
73
74    async fn read_file(&self, req: ReadFileRequest) -> Result<BytesResponse> {
75        let bytes = self.backend.read_file(req.path).await?;
76        Ok(BytesResponse { bytes })
77    }
78}
79
80/// Mock network service using `MockNetworkBackend`.
81#[derive(Debug, Default)]
82pub struct MockNetworkService {
83    backend: crate::network::MockNetworkBackend,
84}
85
86impl MockNetworkService {
87    /// Create a new mock network service.
88    pub fn new() -> Self {
89        Self::default()
90    }
91}
92
93#[async_trait]
94impl NetworkService for MockNetworkService {
95    async fn fetch(&self, req: FetchRequest) -> Result<BytesResponse> {
96        let bytes = self.backend.fetch(req.url).await?;
97        Ok(BytesResponse { bytes })
98    }
99
100    async fn read_file(&self, req: ReadFileRequest) -> Result<BytesResponse> {
101        let bytes = self.backend.read_file(req.path).await?;
102        Ok(BytesResponse { bytes })
103    }
104}