1#![allow(deprecated)]
203
204pub mod ab_testing;
205pub mod ai_contract_diff;
206pub mod ai_response;
207pub mod ai_studio;
209pub mod behavioral_cloning;
211pub mod cache;
212pub mod chain_execution;
213pub mod chaos_utilities;
214pub mod codegen;
215pub mod collection_export;
217pub mod conditions;
218pub mod config;
219pub mod consistency;
221pub mod consumer_contracts;
223pub mod contract_drift;
225pub mod contract_validation;
227pub mod contract_webhooks;
229pub mod custom_fixture;
230pub mod data_source;
232pub mod deceptive_canary;
234pub mod docker_compose;
236pub mod drift_gitops;
238pub mod encryption;
239pub mod error;
240pub mod failure_analysis;
241pub mod failure_injection;
242pub mod fidelity;
243pub mod generate_config;
244pub mod generative_schema;
245pub mod git_watch;
246pub mod graph;
247pub mod import;
248pub mod incidents;
249pub mod intelligent_behavior;
250pub mod latency;
251pub mod lifecycle;
252pub mod multi_tenant;
253pub mod network_profiles;
254pub mod openapi;
255pub mod openapi_routes;
256pub mod output_control;
257pub mod overrides;
258pub mod performance;
259pub mod pillars;
261pub mod pr_generation;
262pub mod priority_handler;
263pub mod protocol_abstraction;
264pub mod proxy;
265pub mod reality;
266pub mod reality_continuum;
267pub mod record_replay;
268pub mod request_capture;
269pub mod request_chaining;
270pub mod request_fingerprint;
271pub mod request_logger;
272pub mod request_scripting;
273pub mod route_chaos;
274pub mod routing;
275pub mod runtime_validation;
277pub mod scenario_studio;
279pub mod scenarios;
280pub mod schema_diff;
281pub mod security;
282pub mod server_utils;
283pub mod snapshots;
285pub mod spec_parser;
286pub mod stateful_handler;
287pub mod sync_watcher;
288pub mod template_library;
290pub mod templating;
291pub mod time_travel;
292pub mod time_travel_handler;
293pub mod traffic_shaping;
294pub mod validation;
295pub mod verification;
296pub mod voice;
297pub mod workspace;
298pub mod workspace_import;
299pub mod workspace_persistence;
300pub mod ws_proxy;
301
302pub use ab_testing::{
303 apply_variant_to_response, select_variant, ABTestConfig, ABTestReport,
304 ABTestingMiddlewareState, MockVariant, VariantAllocation, VariantAnalytics, VariantComparison,
305 VariantManager, VariantSelectionStrategy,
306};
307pub use behavioral_cloning::{
308 AmplificationScope, BehavioralSequence, EdgeAmplificationConfig, EdgeAmplifier,
309 EndpointProbabilityModel, ErrorPattern, LatencyDistribution, PayloadVariation,
310 ProbabilisticModel, SequenceLearner, SequenceStep,
311};
312pub use chain_execution::{ChainExecutionEngine, ChainExecutionResult, ChainExecutionStatus};
313pub use chaos_utilities::{ChaosConfig, ChaosEngine, ChaosResult, ChaosStatistics};
314pub use conditions::{evaluate_condition, ConditionContext, ConditionError};
315pub use config::{
316 apply_env_overrides, load_config, load_config_with_fallback, save_config, ApiKeyConfig,
317 AuthConfig, ServerConfig,
318};
319pub use consistency::{
320 ConsistencyEngine, EntityState, ProtocolState, SessionInfo, StateChangeEvent, UnifiedState,
321};
322pub use custom_fixture::{CustomFixture, CustomFixtureLoader};
323pub use data_source::{
324 DataSource, DataSourceConfig, DataSourceContent, DataSourceFactory, DataSourceManager,
325 DataSourceType, GitDataSource, HttpDataSource, LocalDataSource,
326};
327pub use deceptive_canary::{
328 CanaryRoutingStrategy, CanaryStats, DeceptiveCanaryConfig, DeceptiveCanaryRouter,
329 TeamIdentifiers,
330};
331pub use error::{Error, Result};
332pub use failure_analysis::{
333 ContributingFactor, FailureContext, FailureContextCollector, FailureNarrative,
334 FailureNarrativeGenerator, NarrativeFrame,
335};
336pub use failure_injection::{
337 create_failure_injector, FailureConfig, FailureInjector, TagFailureConfig,
338};
339pub use fidelity::{FidelityCalculator, FidelityScore, SampleComparator, SchemaComparator};
340pub use generate_config::{
341 discover_config_file, load_generate_config, load_generate_config_with_fallback,
342 save_generate_config, BarrelType, GenerateConfig, GenerateOptions, InputConfig, OutputConfig,
343 PluginConfig,
344};
345pub use git_watch::{GitWatchConfig, GitWatchService};
346pub use graph::{
347 builder::GraphBuilder, relationships, ClusterType, EdgeType, GraphCluster, GraphData,
348 GraphEdge, GraphNode, NodeType, Protocol as GraphProtocol,
349};
350pub use latency::LatencyProfile;
351pub use lifecycle::{
352 LifecycleHook, LifecycleHookRegistry, MockLifecycleEvent, RequestContext, ResponseContext,
353 ServerLifecycleEvent,
354};
355pub use multi_tenant::{
356 MultiTenantConfig, MultiTenantWorkspaceRegistry, RoutingStrategy, TenantWorkspace,
357 WorkspaceContext, WorkspaceRouter, WorkspaceStats,
358};
359pub use network_profiles::{NetworkProfile, NetworkProfileCatalog};
360pub use openapi::{
361 OpenApiOperation, OpenApiRoute, OpenApiSchema, OpenApiSecurityRequirement, OpenApiSpec,
362};
363pub use openapi_routes::{
364 create_registry_from_file, create_registry_from_json, OpenApiRouteRegistry, ValidationOptions,
365};
366pub use output_control::{
367 apply_banner, apply_extension, apply_file_naming_template, build_file_naming_context,
368 process_generated_file, BarrelGenerator, FileNamingContext, GeneratedFile,
369};
370pub use overrides::{OverrideMode, OverrideRule, Overrides, PatchOp};
371pub use pillars::{Pillar, PillarMetadata};
372pub use priority_handler::{
373 MockGenerator, MockResponse, PriorityHttpHandler, PriorityResponse, SimpleMockGenerator,
374};
375pub use protocol_abstraction::{
376 MessagePattern, MiddlewareChain, Protocol, ProtocolMiddleware, ProtocolRequest,
377 ProtocolResponse, RequestMatcher, ResponseStatus, SpecOperation, SpecRegistry,
378 ValidationError as ProtocolValidationError, ValidationResult as ProtocolValidationResult,
379};
380pub use proxy::{ProxyConfig, ProxyHandler, ProxyResponse};
381pub use reality::{PresetMetadata, RealityConfig, RealityEngine, RealityLevel, RealityPreset};
382pub use reality_continuum::{
383 ContinuumConfig, ContinuumRule, MergeStrategy, RealityContinuumEngine, ResponseBlender,
384 TimeSchedule, TransitionCurve, TransitionMode,
385};
386pub use record_replay::{
387 clean_old_fixtures, list_fixtures, list_ready_fixtures, list_smoke_endpoints, RecordHandler,
388 RecordReplayHandler, RecordedRequest, ReplayHandler,
389};
390pub use request_chaining::{
391 ChainConfig, ChainContext, ChainDefinition, ChainExecutionContext, ChainLink, ChainRequest,
392 ChainResponse, ChainStore, ChainTemplatingContext, RequestChainRegistry,
393};
394pub use request_fingerprint::{
395 RequestFingerprint, RequestHandlerResult, ResponsePriority, ResponseSource,
396};
397pub use request_logger::{
398 create_grpc_log_entry, create_http_log_entry, create_websocket_log_entry, get_global_logger,
399 init_global_logger, log_request_global, CentralizedRequestLogger, RequestLogEntry,
400};
401pub use route_chaos::{RouteChaosInjector, RouteFaultResponse, RouteMatcher};
402pub use routing::{HttpMethod, Route, RouteRegistry};
403pub use runtime_validation::{
404 RuntimeValidationError, RuntimeValidationResult, RuntimeValidatorConfig, SchemaMetadata,
405};
406pub use scenario_studio::{
407 ConditionOperator, FlowCondition, FlowConnection, FlowDefinition, FlowExecutionResult,
408 FlowExecutor, FlowPosition, FlowStep, FlowStepResult, FlowType, FlowVariant, StepType,
409};
410pub use scenarios::types::StepResult;
411pub use scenarios::{
412 ScenarioDefinition, ScenarioExecutor, ScenarioParameter, ScenarioRegistry, ScenarioResult,
413 ScenarioStep,
414};
415pub use schema_diff::{to_enhanced_422_json, validation_diff, ValidationError};
416pub use server_utils::errors::{json_error, json_success};
417pub use server_utils::{create_socket_addr, localhost_socket_addr, wildcard_socket_addr};
418pub use snapshots::{SnapshotComponents, SnapshotManager, SnapshotManifest, SnapshotMetadata};
419pub use spec_parser::{GraphQLValidator, OpenApiValidator, SpecFormat};
420pub use stateful_handler::{
421 ResourceIdExtract, StateInfo, StateResponse, StatefulConfig, StatefulResponse,
422 StatefulResponseHandler, TransitionTrigger,
423};
424pub use sync_watcher::{FileChange, SyncEvent, SyncService, SyncWatcher};
425pub use template_library::{
426 TemplateLibrary, TemplateLibraryEntry, TemplateLibraryManager, TemplateMarketplace,
427 TemplateMetadata, TemplateVersion,
428};
429pub use templating::{expand_str, expand_tokens};
430pub use time_travel::{
431 cron::{CronJob, CronJobAction, CronScheduler},
432 get_global_clock, is_time_travel_enabled, now as time_travel_now, register_global_clock,
433 unregister_global_clock, RepeatConfig, ResponseScheduler, ScheduledResponse, TimeScenario,
434 TimeTravelConfig, TimeTravelManager, TimeTravelStatus, VirtualClock,
435};
436pub use time_travel_handler::{
437 time_travel_middleware, ScheduledResponseWrapper, TimeTravelHandler,
438};
439pub use traffic_shaping::{BandwidthConfig, BurstLossConfig, TrafficShaper, TrafficShapingConfig};
440pub use uuid::Uuid;
441pub use validation::{validate_openapi_operation_security, validate_openapi_security, Validator};
442pub use verification::{
443 matches_verification_pattern, verify_at_least, verify_never, verify_requests, verify_sequence,
444 VerificationCount, VerificationRequest, VerificationResult,
445};
446pub use voice::{
447 ConversationContext, ConversationManager, ConversationState, GeneratedWorkspaceScenario,
448 HookTranspiler, ParsedCommand, ParsedWorkspaceScenario, VoiceCommandParser, VoiceSpecGenerator,
449 WorkspaceConfigSummary, WorkspaceScenarioGenerator,
450};
451pub use workspace::{EntityId, Folder, MockRequest, Workspace, WorkspaceConfig, WorkspaceRegistry};
452pub use workspace_import::{
453 create_workspace_from_curl, create_workspace_from_har, create_workspace_from_insomnia,
454 create_workspace_from_postman, import_postman_to_existing_workspace,
455 import_postman_to_workspace, WorkspaceImportConfig, WorkspaceImportResult,
456};
457pub use workspace_persistence::WorkspacePersistence;
458pub use ws_proxy::{WsProxyConfig, WsProxyHandler, WsProxyRule};
459#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
464#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
465#[serde(default)]
466pub struct Config {
467 pub latency_enabled: bool,
469 pub failures_enabled: bool,
471 pub overrides_enabled: bool,
473 pub traffic_shaping_enabled: bool,
475 pub failure_config: Option<FailureConfig>,
477 pub proxy: Option<ProxyConfig>,
479 pub default_latency: LatencyProfile,
481 pub traffic_shaping: TrafficShapingConfig,
483 pub chaos_random: Option<ChaosConfig>,
485 pub max_request_logs: usize,
488 pub time_travel: TimeTravelConfig,
490}
491
492impl Default for Config {
494 fn default() -> Self {
495 Self {
496 latency_enabled: true,
497 failures_enabled: false,
498 overrides_enabled: true,
499 traffic_shaping_enabled: false,
500 failure_config: None,
501 proxy: None,
502 default_latency: LatencyProfile::default(),
503 traffic_shaping: TrafficShapingConfig::default(),
504 chaos_random: None,
505 max_request_logs: 1000, time_travel: TimeTravelConfig::default(),
507 }
508 }
509}
510
511impl Config {
512 pub fn create_chaos_engine(&self) -> Option<ChaosEngine> {
514 self.chaos_random.as_ref().map(|config| ChaosEngine::new(config.clone()))
515 }
516
517 pub fn is_chaos_random_enabled(&self) -> bool {
519 self.chaos_random.as_ref().map(|c| c.enabled).unwrap_or(false)
520 }
521}
522
523#[cfg(test)]
524mod tests {
525 use super::*;
526
527 #[test]
528 fn test_config_default() {
529 let config = Config::default();
530 assert!(config.latency_enabled);
531 assert!(!config.failures_enabled);
532 assert!(config.overrides_enabled);
533 assert!(!config.traffic_shaping_enabled);
534 assert!(config.failure_config.is_none());
535 assert!(config.proxy.is_none());
536 }
537
538 #[test]
539 fn test_config_serialization() {
540 let config = Config::default();
541 let json = serde_json::to_string(&config).unwrap();
542 assert!(json.contains("latency_enabled"));
543 assert!(json.contains("failures_enabled"));
544 }
545
546 #[test]
547 fn test_config_deserialization() {
548 let config = Config {
550 latency_enabled: false,
551 failures_enabled: true,
552 ..Default::default()
553 };
554
555 let json = serde_json::to_string(&config).unwrap();
557 let deserialized: Config = serde_json::from_str(&json).unwrap();
558
559 assert!(!deserialized.latency_enabled);
560 assert!(deserialized.failures_enabled);
561 assert!(deserialized.overrides_enabled);
562 }
563
564 #[test]
565 fn test_config_with_custom_values() {
566 let config = Config {
567 latency_enabled: false,
568 failures_enabled: true,
569 ..Default::default()
570 };
571
572 assert!(!config.latency_enabled);
573 assert!(config.failures_enabled);
574 }
575}