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