1#![allow(deprecated)]
218
219#[cfg(feature = "advanced")]
220pub mod ab_testing;
221#[cfg(feature = "ai")]
222pub mod ai_contract_diff;
225#[cfg(feature = "ai")]
226#[deprecated(note = "Will be extracted to mockforge-intelligence crate")]
227pub mod ai_response;
228#[cfg(feature = "ai")]
233pub mod ai_studio;
234#[cfg(feature = "ai")]
236#[deprecated(note = "Will be extracted to mockforge-intelligence crate")]
237pub mod behavioral_cloning;
238#[cfg(feature = "advanced")]
239pub mod behavioral_economics;
241#[allow(dead_code)]
242pub(crate) mod cache;
243pub mod chain_execution;
244pub mod chaos_utilities;
245#[cfg(feature = "advanced")]
246#[deprecated(note = "Will be extracted to mockforge-import crate")]
247pub mod codegen;
248#[allow(dead_code)]
250pub(crate) mod collection_export;
251pub mod conditions;
252pub mod config;
253#[allow(dead_code)]
255pub(crate) mod connection_pool;
256#[cfg(feature = "advanced")]
258pub mod consistency;
259#[cfg(feature = "contracts")]
260#[deprecated(note = "Will be extracted to mockforge-contracts crate")]
261pub mod consumer_contracts;
263#[cfg(feature = "contracts")]
264pub mod contract_drift;
269#[cfg(feature = "contracts")]
270pub mod contract_validation;
273#[cfg(feature = "contracts")]
275#[allow(dead_code)]
276pub(crate) mod contract_webhooks;
277pub(crate) use mockforge_openapi::custom_fixture;
280pub mod data_source;
282pub mod deceptive_canary;
284#[allow(dead_code)]
286pub(crate) mod docker_compose;
287#[cfg(feature = "contracts")]
288pub mod drift_gitops;
291pub mod encryption;
293pub mod error;
294pub mod failure_analysis;
295pub(crate) use mockforge_foundation::failure_injection;
298pub mod fidelity;
299pub mod fixture_store;
301pub mod generate_config;
302#[allow(dead_code)]
303pub(crate) mod generative_schema;
304#[deprecated(note = "Will be extracted to mockforge-workspace crate")]
305pub mod git_watch;
306#[cfg(feature = "advanced")]
307pub mod graph;
308#[cfg(feature = "workspace-mgmt")]
309#[deprecated(note = "Will be extracted to mockforge-import crate")]
310pub mod import;
311#[cfg(feature = "contracts")]
312pub mod incidents;
313#[cfg(feature = "ai")]
314pub mod intelligent_behavior;
317pub(crate) use mockforge_foundation::latency;
320pub mod lifecycle;
321#[cfg(feature = "advanced")]
322pub mod multi_tenant;
325pub mod network_profiles;
326pub mod odata_rewrite;
328pub mod openapi;
329pub mod openapi_rewriter;
334pub(crate) use mockforge_openapi::openapi_routes;
340pub mod output_control;
341pub mod overrides;
342pub mod performance;
343pub mod pillar_tracking;
345pub mod pillars;
347pub use mockforge_intelligence::pr_generation;
352pub mod priority_handler;
353pub mod protocol_abstraction;
354pub mod protocol_server;
356#[deprecated(note = "Use mockforge_proxy crate directly")]
359pub mod proxy;
360pub mod reality;
361#[cfg(feature = "advanced")]
362pub mod reality_continuum;
363pub mod record_replay;
364pub mod request_capture;
365pub mod request_chaining;
366pub(crate) use mockforge_openapi::request_fingerprint;
369pub mod request_logger;
370#[cfg(feature = "scripting")]
371pub(crate) mod request_scripting;
372#[allow(dead_code)]
376pub(crate) mod persona_lifecycle_time;
377pub mod routing;
378pub mod runtime_validation;
380#[cfg(feature = "advanced")]
382pub mod scenario_studio;
383#[cfg(feature = "advanced")]
384pub mod scenarios;
385pub(crate) use mockforge_foundation::schema_diff;
389pub mod security;
390pub mod server_utils;
391#[cfg(feature = "advanced")]
393pub mod snapshots;
394pub(crate) use mockforge_openapi::spec_parser;
396pub mod stateful_handler;
397pub mod sync_watcher;
399pub mod template_expansion;
401pub mod template_library;
403pub mod templating;
404#[cfg(feature = "advanced")]
405pub mod time_travel;
406#[cfg(feature = "advanced")]
407pub mod time_travel_handler;
408pub mod tls;
410pub mod traffic_shaping;
411pub mod validation;
412pub mod verification;
413#[cfg(feature = "voice")]
414pub mod voice;
415#[cfg(feature = "workspace-mgmt")]
416pub mod workspace;
420#[cfg(feature = "workspace-mgmt")]
421pub mod workspace_import;
422#[cfg(feature = "workspace-mgmt")]
423pub mod workspace_persistence;
424pub mod ws_proxy;
425
426#[cfg(feature = "advanced")]
427pub use ab_testing::{
428 apply_variant_to_response, select_variant, ABTestConfig, ABTestReport,
429 ABTestingMiddlewareState, MockVariant, VariantAllocation, VariantAnalytics, VariantComparison,
430 VariantManager, VariantSelectionStrategy,
431};
432#[cfg(feature = "ai")]
433#[deprecated(note = "Will be extracted to mockforge-intelligence crate")]
434pub use behavioral_cloning::{
435 AmplificationScope, BehavioralSequence, EdgeAmplificationConfig, EdgeAmplifier,
436 EndpointProbabilityModel, ErrorPattern, LatencyDistribution, PayloadVariation,
437 ProbabilisticModel, SequenceLearner, SequenceStep,
438};
439pub use chain_execution::{ChainExecutionEngine, ChainExecutionResult, ChainExecutionStatus};
440#[deprecated(note = "Use mockforge_chaos::core_chaos_utilities instead")]
441pub use chaos_utilities::{ChaosConfig, ChaosEngine, ChaosResult, ChaosStatistics};
442pub use conditions::{evaluate_condition, ConditionContext, ConditionError};
443pub use config::{
444 apply_env_overrides, load_config, load_config_with_fallback, save_config, ApiKeyConfig,
445 AuthConfig, ServerConfig,
446};
447#[cfg(feature = "advanced")]
448pub use consistency::{
449 ConsistencyEngine, EntityState, ProtocolState, SessionInfo, StateChangeEvent, UnifiedState,
450};
451pub(crate) use custom_fixture::CustomFixtureLoader;
452pub use data_source::{
453 DataSource, DataSourceConfig, DataSourceContent, DataSourceFactory, DataSourceManager,
454 DataSourceType, GitDataSource, HttpDataSource, LocalDataSource,
455};
456pub use deceptive_canary::{
457 CanaryRoutingStrategy, CanaryStats, DeceptiveCanaryConfig, DeceptiveCanaryRouter,
458 TeamIdentifiers,
459};
460pub use error::{Error, Result};
461pub use failure_analysis::{
462 ContributingFactor, FailureContext, FailureContextCollector, FailureNarrative,
463 FailureNarrativeGenerator, NarrativeFrame,
464};
465#[deprecated(note = "Use mockforge_chaos::core_failure_injection instead")]
466pub(crate) use failure_injection::FailureInjector;
467pub use fidelity::{FidelityCalculator, FidelityScore, SampleComparator, SchemaComparator};
468pub use generate_config::{
469 discover_config_file, load_generate_config, load_generate_config_with_fallback,
470 save_generate_config, BarrelType, GenerateConfig, GenerateOptions, InputConfig, OutputConfig,
471 PluginConfig,
472};
473#[deprecated(note = "Will be extracted to mockforge-workspace crate")]
474pub use git_watch::{GitWatchConfig, GitWatchService};
475#[cfg(feature = "advanced")]
476pub use graph::{
477 builder::GraphBuilder, relationships, ClusterType, EdgeType, GraphCluster, GraphData,
478 GraphEdge, GraphNode, NodeType, Protocol as GraphProtocol,
479};
480pub(crate) use latency::LatencyProfile;
481pub use lifecycle::{
482 LifecycleHook, LifecycleHookRegistry, MockLifecycleEvent, RequestContext, ResponseContext,
483 ServerLifecycleEvent,
484};
485#[cfg(feature = "advanced")]
486pub use multi_tenant::{
487 MultiTenantConfig, MultiTenantWorkspaceRegistry, RoutingStrategy, TenantWorkspace,
488 WorkspaceContext, WorkspaceRouter, WorkspaceStats,
489};
490#[deprecated(note = "Use mockforge_chaos::core_network_profiles instead")]
491pub use network_profiles::{NetworkProfile, NetworkProfileCatalog};
492pub(crate) use openapi::OpenApiSpec;
493pub use output_control::{
494 apply_banner, apply_extension, apply_file_naming_template, build_file_naming_context,
495 process_generated_file, BarrelGenerator, FileNamingContext, GeneratedFile,
496};
497pub use overrides::{OverrideMode, OverrideRule, Overrides, PatchOp};
498pub use pillars::{Pillar, PillarMetadata};
499pub use priority_handler::{
500 CustomFixtureStep, FailureInjectionStep, GenerationResult, MockGenerator, MockResponse,
501 PriorityHttpHandler, PriorityRequest, PriorityResponse, PriorityStep, SimpleMockGenerator,
502};
503pub use protocol_abstraction::{
504 MessagePattern, MiddlewareAction, MiddlewareChain, Protocol, ProtocolMiddleware,
505 ProtocolRequest, ProtocolResponse, RequestMatcher, ResponseStatus, SpecOperation, SpecRegistry,
506 ValidationError as ProtocolValidationError, ValidationResult as ProtocolValidationResult,
507};
508#[deprecated(note = "Will be extracted to mockforge-proxy crate")]
509pub use proxy::{ProxyConfig, ProxyHandler, ProxyResponse};
510pub use reality::{PresetMetadata, RealityConfig, RealityEngine, RealityLevel, RealityPreset};
511#[cfg(feature = "advanced")]
512pub use reality_continuum::{
513 ContinuumConfig, ContinuumRule, MergeStrategy, RealityContinuumEngine, ResponseBlender,
514 TimeSchedule, TransitionCurve, TransitionMode,
515};
516pub use record_replay::{
517 clean_old_fixtures, list_fixtures, list_ready_fixtures, list_smoke_endpoints, RecordHandler,
518 RecordReplayHandler, RecordedRequest, ReplayHandler,
519};
520pub use request_chaining::{
521 ChainConfig, ChainContext, ChainDefinition, ChainExecutionContext, ChainLink, ChainRequest,
522 ChainResponse, ChainStore, ChainTemplatingContext, RequestChainRegistry,
523};
524pub(crate) use request_fingerprint::{RequestFingerprint, ResponsePriority, ResponseSource};
525pub use request_logger::{
526 create_grpc_log_entry, create_http_log_entry, create_http_log_entry_with_query,
527 create_websocket_log_entry, get_global_logger, init_global_logger, log_request_global,
528 CentralizedRequestLogger, RequestLogEntry,
529};
530pub use routing::{HttpMethod, Route, RouteRegistry};
533pub use runtime_validation::{
534 RuntimeValidationError, RuntimeValidationResult, RuntimeValidatorConfig, SchemaMetadata,
535};
536#[cfg(feature = "advanced")]
537pub use scenario_studio::{
538 ConditionOperator, FlowCondition, FlowConnection, FlowDefinition, FlowExecutionResult,
539 FlowExecutor, FlowPosition, FlowStep, FlowStepResult, FlowType, FlowVariant, StepType,
540};
541#[cfg(feature = "advanced")]
542pub use scenarios::types::StepResult;
543#[cfg(feature = "advanced")]
544pub use scenarios::{
545 ScenarioDefinition, ScenarioExecutor, ScenarioParameter, ScenarioRegistry, ScenarioResult,
546 ScenarioStep,
547};
548pub use server_utils::errors::{json_error, json_success};
549pub use server_utils::{create_socket_addr, localhost_socket_addr, wildcard_socket_addr};
550#[cfg(feature = "advanced")]
551pub use snapshots::{SnapshotComponents, SnapshotManager, SnapshotManifest, SnapshotMetadata};
552pub use stateful_handler::{
553 ResourceIdExtract, StateInfo, StateResponse, StatefulConfig, StatefulResponse,
554 StatefulResponseHandler, TransitionTrigger,
555};
556#[cfg(feature = "workspace-mgmt")]
557pub use sync_watcher::{FileChange, SyncEvent, SyncService, SyncWatcher};
558pub use template_library::{
559 TemplateLibrary, TemplateLibraryEntry, TemplateLibraryManager, TemplateMarketplace,
560 TemplateMetadata, TemplateVersion,
561};
562pub use templating::{expand_str, expand_tokens};
563#[cfg(feature = "advanced")]
564pub use time_travel::{
565 cron::{CronJob, CronJobAction, CronScheduler},
566 get_global_clock, is_time_travel_enabled, now as time_travel_now, register_global_clock,
567 unregister_global_clock, RepeatConfig, ResponseScheduler, ScheduledResponse, TimeScenario,
568 TimeTravelConfig, TimeTravelManager, TimeTravelStatus, VirtualClock,
569};
570#[cfg(feature = "advanced")]
571pub use time_travel_handler::{
572 time_travel_middleware, ScheduledResponseWrapper, TimeTravelHandler,
573};
574#[deprecated(note = "Use mockforge_chaos::core_traffic_shaping instead")]
575pub use traffic_shaping::{BandwidthConfig, BurstLossConfig, TrafficShaper, TrafficShapingConfig};
576pub use uuid::Uuid;
577pub use validation::{validate_openapi_operation_security, validate_openapi_security, Validator};
578pub use verification::{
579 matches_verification_pattern, verify_at_least, verify_never, verify_requests, verify_sequence,
580 VerificationCount, VerificationRequest, VerificationResult,
581};
582#[cfg(feature = "voice")]
583pub use voice::{
584 ConversationContext, ConversationManager, ConversationState, GeneratedWorkspaceScenario,
585 HookTranspiler, ParsedCommand, ParsedWorkspaceScenario, VoiceCommandParser, VoiceSpecGenerator,
586 WorkspaceConfigSummary, WorkspaceScenarioGenerator,
587};
588#[cfg(feature = "workspace-mgmt")]
589pub use workspace::promotion_trait::PromotionService;
590#[cfg(feature = "workspace-mgmt")]
591pub use workspace::{EntityId, Folder, MockRequest, Workspace, WorkspaceConfig, WorkspaceRegistry};
592#[cfg(feature = "workspace-mgmt")]
593pub use workspace_import::{
594 create_workspace_from_curl, create_workspace_from_har, create_workspace_from_insomnia,
595 create_workspace_from_postman, import_postman_to_existing_workspace,
596 import_postman_to_workspace, WorkspaceImportConfig, WorkspaceImportResult,
597};
598#[cfg(feature = "workspace-mgmt")]
599pub use workspace_persistence::WorkspacePersistence;
600pub use ws_proxy::{WsProxyConfig, WsProxyHandler, WsProxyRule};
601pub mod routes {
610 pub use crate::openapi::{
611 OpenApiOperation, OpenApiRoute, OpenApiSchema, OpenApiSecurityRequirement, OpenApiSpec,
612 };
613 pub use crate::openapi_routes::{
614 create_registry_from_file, create_registry_from_json, OpenApiRouteRegistry,
615 ValidationOptions,
616 };
617 pub use crate::routing::{HttpMethod, Route, RouteRegistry};
618}
619
620pub mod middleware {
622 pub use crate::latency::LatencyInjector;
623 pub use crate::overrides::{OverrideMode, OverrideRule, Overrides, PatchOp};
624 pub use crate::protocol_abstraction::{
625 MessagePattern, MiddlewareAction, MiddlewareChain, Protocol, ProtocolMiddleware,
626 ProtocolRequest, ProtocolResponse, RequestMatcher, ResponseStatus, SpecOperation,
627 SpecRegistry,
628 };
629}
630
631pub mod generation {
633 pub use crate::priority_handler::{
634 CustomFixtureStep, FailureInjectionStep, GenerationResult, MockGenerator, MockResponse,
635 PriorityHttpHandler, PriorityRequest, PriorityResponse, PriorityStep, SimpleMockGenerator,
636 };
637 pub use crate::stateful_handler::{StatefulConfig, StatefulResponse, StatefulResponseHandler};
638}
639
640pub mod validate {
642 pub use crate::runtime_validation::{
643 RuntimeValidationError, RuntimeValidationResult, RuntimeValidatorConfig, SchemaMetadata,
644 };
645 pub use crate::spec_parser::{GraphQLValidator, OpenApiValidator, SpecFormat};
646 pub use crate::validation::{
647 validate_openapi_operation_security, validate_openapi_security, Validator,
648 };
649 pub use crate::verification::{
650 matches_verification_pattern, verify_at_least, verify_never, verify_requests,
651 verify_sequence, VerificationCount, VerificationRequest, VerificationResult,
652 };
653}
654
655pub mod fixtures {
657 pub use crate::custom_fixture::{CustomFixture, CustomFixtureLoader, NestedFixture};
658 pub use crate::fixture_store::{
659 load_fixtures_from_dir, FixtureFileFormat, FixtureFileGranularity, FixtureLoadErrorMode,
660 FixtureLoadOptions,
661 };
662 pub use crate::record_replay::{
663 RecordHandler, RecordReplayHandler, RecordedRequest, ReplayHandler,
664 };
665}
666
667#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
669#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
670#[serde(default)]
671pub struct Config {
672 pub latency_enabled: bool,
674 pub failures_enabled: bool,
676 pub overrides_enabled: bool,
678 pub traffic_shaping_enabled: bool,
680 pub failure_config: Option<failure_injection::FailureConfig>,
682 pub proxy: Option<ProxyConfig>,
684 pub default_latency: LatencyProfile,
686 pub traffic_shaping: TrafficShapingConfig,
688 pub chaos_random: Option<ChaosConfig>,
690 pub max_request_logs: usize,
693 pub time_travel: TimeTravelConfig,
695}
696
697impl Default for Config {
699 fn default() -> Self {
700 Self {
701 latency_enabled: true,
702 failures_enabled: false,
703 overrides_enabled: true,
704 traffic_shaping_enabled: false,
705 failure_config: None,
706 proxy: None,
707 default_latency: LatencyProfile::default(),
708 traffic_shaping: TrafficShapingConfig::default(),
709 chaos_random: None,
710 max_request_logs: 1000, time_travel: TimeTravelConfig::default(),
712 }
713 }
714}
715
716impl Config {
717 pub fn create_chaos_engine(&self) -> Option<ChaosEngine> {
719 self.chaos_random.as_ref().map(|config| ChaosEngine::new(config.clone()))
720 }
721
722 pub fn is_chaos_random_enabled(&self) -> bool {
724 self.chaos_random.as_ref().map(|c| c.enabled).unwrap_or(false)
725 }
726}
727
728#[cfg(test)]
729mod tests {
730 use super::*;
731
732 #[test]
733 fn test_config_default() {
734 let config = Config::default();
735 assert!(config.latency_enabled);
736 assert!(!config.failures_enabled);
737 assert!(config.overrides_enabled);
738 assert!(!config.traffic_shaping_enabled);
739 assert!(config.failure_config.is_none());
740 assert!(config.proxy.is_none());
741 }
742
743 #[test]
744 fn test_config_serialization() {
745 let config = Config::default();
746 let json = serde_json::to_string(&config).unwrap();
747 assert!(json.contains("latency_enabled"));
748 assert!(json.contains("failures_enabled"));
749 }
750
751 #[test]
752 fn test_config_deserialization() {
753 let config = Config {
755 latency_enabled: false,
756 failures_enabled: true,
757 ..Default::default()
758 };
759
760 let json = serde_json::to_string(&config).unwrap();
762 let deserialized: Config = serde_json::from_str(&json).unwrap();
763
764 assert!(!deserialized.latency_enabled);
765 assert!(deserialized.failures_enabled);
766 assert!(deserialized.overrides_enabled);
767 }
768
769 #[test]
770 fn test_config_with_custom_values() {
771 let config = Config {
772 latency_enabled: false,
773 failures_enabled: true,
774 ..Default::default()
775 };
776
777 assert!(!config.latency_enabled);
778 assert!(config.failures_enabled);
779 }
780}