use serde::Serialize;
use serde_json::{Map, Value};
#[derive(Debug, Clone)]
pub struct WindowBase {
pub table: String,
pub variable: String,
pub fixed_scopes: Vec<(String, Vec<String>)>,
pub params: Option<String>,
}
#[derive(Debug, Clone)]
pub enum Mutation {
Upsert {
table: String,
values: Map<String, Value>,
base_version: Option<i64>,
},
Delete {
table: String,
row_id: String,
base_version: Option<i64>,
},
}
#[derive(Debug, Clone, Serialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct SchemaFloor {
#[serde(skip_serializing_if = "Option::is_none")]
pub required_schema_version: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub latest_schema_version: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct LeaseState {
#[serde(skip_serializing_if = "Option::is_none")]
pub lease_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_at_ms: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_code: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PresencePeer {
pub actor_id: String,
pub client_id: String,
pub doc: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct SyncReport {
pub pushed: u32,
pub applied: Vec<String>,
pub rejected: Vec<String>,
pub retryable: Vec<String>,
pub conflicts: u32,
pub commits_applied: u32,
pub segment_rows_applied: u32,
pub bootstrapping: Vec<String>,
pub resets: Vec<String>,
pub revoked: Vec<String>,
pub failed: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub schema_floor: Option<SchemaFloor>,
}
#[derive(Debug, Clone)]
pub enum SyncOutcome {
Ok(SyncReport),
Failed { error_code: String, message: String },
}
impl SyncOutcome {
pub fn to_json(&self) -> Value {
match self {
SyncOutcome::Ok(report) => {
let mut map = Map::new();
map.insert("ok".to_owned(), Value::Bool(true));
map.insert(
"report".to_owned(),
serde_json::to_value(report).expect("report serializes"),
);
Value::Object(map)
}
SyncOutcome::Failed {
error_code,
message,
} => {
let mut map = Map::new();
map.insert("ok".to_owned(), Value::Bool(false));
map.insert("errorCode".to_owned(), Value::from(error_code.clone()));
map.insert("message".to_owned(), Value::from(message.clone()));
Value::Object(map)
}
}
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ConflictRecord {
pub client_commit_id: String,
pub op_index: i32,
pub table: String,
pub row_id: String,
pub code: String,
pub server_version: i64,
pub server_row: Map<String, Value>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RejectionRecord {
pub client_commit_id: String,
pub op_index: i32,
pub code: String,
pub retryable: bool,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RowState {
pub row_id: String,
pub version: i64,
pub values: Map<String, Value>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SubscriptionStateView {
pub id: String,
pub table: String,
pub status: String,
pub cursor: i64,
pub has_resume_token: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_scopes: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason_code: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct ClientLimits {
pub limit_commits: Option<i32>,
pub limit_snapshot_rows: Option<i32>,
pub max_snapshot_pages: Option<i32>,
pub accept: Option<u8>,
pub blob_cache_max_bytes: Option<i64>,
}