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