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