spacedriveapp/spacedrive · error · anyhow::Error

Invalid event type: {}

Error message

Invalid event type: {}

What it means

'sd sync events export --event-type <value>' fails when the value does not exactly match a name accepted by SyncEventType::from_str (core/src/infra/sync/event_log/types.rs:189). Valid values are the snake_case names: state_transition, backfill_session_started, backfill_session_completed, backfill_session_failed, catch_up_session_started, catch_up_session_completed, batch_ingestion, backfill_request_sent, backfill_request_received, backfill_response_sent, peer_connected, peer_disconnected, sync_error.

Source

Thrown at apps/cli/src/domains/sync/mod.rs:437

	let library_id = ctx.library_id.ok_or_else(|| {
		anyhow::anyhow!("No library selected. Use 'sd library switch' to select a library first.")
	})?;

	// Build query
	let mut query = SyncEventQuery::new(library_id).with_limit(args.limit);

	// Parse time filter
	if let Some(since_str) = &args.since {
		let since = parse_time_filter(since_str)?;
		query = query.with_time_range(since, Utc::now());
	}

	// Parse event type filter
	if let Some(event_type_str) = &args.event_type {
		if let Some(event_type) = SyncEventType::from_str(event_type_str) {
			query = query.with_event_types(vec![event_type]);
		} else {
			return Err(anyhow::anyhow!("Invalid event type: {}", event_type_str));
		}
	}

	// Parse correlation ID filter
	if let Some(corr_id_str) = &args.correlation_id {
		let corr_id = uuid::Uuid::parse_str(corr_id_str)?;
		query = query.with_correlation_id(corr_id);
	}

	// Parse severity filter
	if let Some(severity_str) = &args.severity {
		if let Some(severity) = EventSeverity::from_str(severity_str) {
			query = query.with_severities(vec![severity]);
		} else {
			return Err(anyhow::anyhow!("Invalid severity: {}", severity_str));
		}
	}

View on GitHub (pinned to 6dfeccf211)

Solutions

  1. Use an exact snake_case value, e.g. --event-type peer_connected
  2. Run the export without --event-type and read the event_type field of the JSON output for the valid names
  3. Check SyncEventType::from_str in core/src/infra/sync/event_log/types.rs for the authoritative list for your build

Example fix

# before
sd sync events export --event-type PeerConnected

# after
sd sync events export --event-type peer_connected
Defensive patterns

Strategy: validation

Validate before calling

const VALID_EVENT_TYPES: &[&str] = &[
    "state_transition", "backfill_session_started", "backfill_session_completed",
    "backfill_session_failed", "catch_up_session_started", "catch_up_session_completed",
    "batch_ingestion", "backfill_request_sent", "backfill_request_received",
    "backfill_response_sent", "peer_connected", "peer_disconnected", "sync_error",
];

fn is_valid_event_type(s: &str) -> bool {
    VALID_EVENT_TYPES.contains(&s)
}

Type guard

fn as_event_type(s: &str) -> Option<sd_core::infra::sync::event_log::types::SyncEventType> {
    sd_core::infra::sync::event_log::types::SyncEventType::from_str(s)
}

Try / catch

match SyncEventType::from_str(event_type_str) {
    Some(t) => query = query.with_event_types(vec![t]),
    None => return Err(anyhow!("Invalid event type: {}. Valid: {}", event_type_str, VALID_EVENT_TYPES.join(", "))),
}

Prevention

When it happens

Trigger: Passing CamelCase ('PeerConnected'), spaces, abbreviations ('backfill'), or any plural/singular variant that is not byte-for-byte identical to the snake_case list above.

Common situations: Guessing flag values instead of checking the enum; scripts written against an older core where event type names differed; copy-pasting UI labels into the CLI.

Related errors


AI-assisted analysis of spacedriveapp/spacedrive@6dfeccf211 (2026-08-16). Data as JSON: /api/errors/96d7b22814d8b3b7. Report an issue: GitHub.