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