magneto_serge/
lib.rs

1//! # magneto-serge
2//!
3//! Multi-language HTTP/WebSocket proxy library for testing with record/replay capabilities.
4//!
5//! This library provides a MITM proxy that intercepts HTTP/HTTPS and WebSocket traffic,
6//! records interactions into "cassettes", and can replay them deterministically.
7
8// Allow clippy warnings from UniFFI generated code
9#![allow(clippy::empty_line_after_doc_comments)]
10
11// Core modules (always available)
12pub mod cassette;
13pub mod cookies;
14pub mod error;
15pub mod filters;
16pub mod hooks;
17pub mod matching;
18pub mod player;
19pub mod proxy;
20pub mod recorder;
21pub mod templates;
22pub mod test_helpers;
23pub mod tls;
24pub mod websocket;
25
26// Optional API module (requires 'api' feature)
27#[cfg(feature = "api")]
28pub mod api;
29
30// Optional Hydra module (requires 'hydra' feature)
31#[cfg(feature = "hydra")]
32pub mod hydra;
33
34// Core exports (always available)
35pub use error::{MatgtoError, Result};
36pub use filters::{FilterPresets, RecordingFilters};
37pub use hooks::{RecordHook, RecordHooks, ReplayHook, ReplayHooks};
38pub use matching::{
39    BodyMatchMode, CustomMatcher, MatchingStrategy, RequestSignature, UrlMatchMode,
40};
41pub use player::{LatencyMode, Player};
42pub use proxy::{MagnetoProxy, ProxyMode};
43pub use recorder::Recorder;
44pub use templates::TemplateEngine;
45pub use tls::CertificateAuthority;
46pub use websocket::{WebSocketInterceptor, WebSocketPlayer, WebSocketRecorder};
47
48// Re-export cassette types
49pub use cassette::{Cassette, HttpRequest, HttpResponse, Interaction, WebSocketMessage};
50
51// Re-export cookie types
52pub use cookies::{Cookie, CookieJar, SameSite};
53
54// API exports (only when 'api' feature is enabled)
55#[cfg(feature = "api")]
56pub use api::{
57    ApiConfig, ApiResponse, ApiServer, ProxyStatus, StartProxyRequest, StopProxyRequest,
58};
59
60// Hydra exports (only when 'hydra' feature is enabled)
61#[cfg(feature = "hydra")]
62pub use hydra::{
63    ApiDocumentation, HydraClass, HydraCollection, HydraError, HydraLink, HydraOperation,
64    HydraProperty, HydraResponse, HydraSearch, HydraView, JsonLdContext, SupportedClass,
65    SupportedProperty,
66};
67
68// UniFFI factory function
69/// Create a new MagnetoProxy instance (returns None on error)
70///
71/// This is a convenience function for language bindings
72pub fn create_proxy(cassette_dir: String) -> Option<std::sync::Arc<MagnetoProxy>> {
73    use proxy::MagnetoProxy;
74    let path: &std::path::Path = cassette_dir.as_ref();
75    MagnetoProxy::new_internal(path)
76        .ok()
77        .map(std::sync::Arc::new)
78}
79
80/// Get library version
81pub fn version() -> String {
82    env!("CARGO_PKG_VERSION").to_string()
83}
84
85// Include UniFFI scaffolding
86uniffi::include_scaffolding!("magneto_serge");
87
88#[cfg(test)]
89mod tests {
90    #[test]
91    fn test_library_loads() {
92        // Basic smoke test - verify version is set
93        assert!(!crate::version().is_empty());
94    }
95}