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