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