use std::future::Future;
use parse_rust_core::{ClassLevelPermissions, ParseError, ParseMap, ParseValue};
use crate::query::{Query, QueryOptions, Update};
use crate::schema::{ClassSchema, FieldType};
pub type Row = ParseMap;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct WriteResult {
pub object_id: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AddFieldOutcome {
Added,
AlreadyPresentSameType,
Conflict { existing: FieldType },
}
pub trait StorageAdapter: Send + Sync {
fn all_schemas(&self) -> impl Future<Output = Result<Vec<ClassSchema>, ParseError>> + Send;
fn upsert_schema(
&self,
schema: &ClassSchema,
) -> impl Future<Output = Result<(), ParseError>> + Send;
fn insert_schema(
&self,
schema: &ClassSchema,
) -> impl Future<Output = Result<(), ParseError>> + Send;
fn reserve_field(
&self,
class_name: &str,
field_name: &str,
field_type: &FieldType,
options: Option<&ParseMap>,
) -> impl Future<Output = Result<AddFieldOutcome, ParseError>> + Send;
fn set_field_options(
&self,
class_name: &str,
field_name: &str,
options: &ParseMap,
) -> impl Future<Output = Result<(), ParseError>> + Send;
fn set_indexes(
&self,
class_name: &str,
indexes: &ParseMap,
) -> impl Future<Output = Result<(), ParseError>> + Send;
fn set_class_permissions(
&self,
class_name: &str,
clp: Option<&ClassLevelPermissions>,
) -> impl Future<Output = Result<(), ParseError>> + Send;
fn delete_class(
&self,
schema: &ClassSchema,
) -> impl Future<Output = Result<(), ParseError>> + Send;
fn delete_fields(
&self,
schema: &ClassSchema,
fields: &[String],
) -> impl Future<Output = Result<(), ParseError>> + Send;
fn create(
&self,
schema: &ClassSchema,
row: &Row,
) -> impl Future<Output = Result<WriteResult, ParseError>> + Send;
fn upsert_one(
&self,
schema: &ClassSchema,
query: &Query,
row: &Row,
) -> impl Future<Output = Result<(), ParseError>> + Send;
fn find(
&self,
schema: &ClassSchema,
query: &Query,
options: &QueryOptions,
) -> impl Future<Output = Result<Vec<Row>, ParseError>> + Send;
fn count(
&self,
schema: &ClassSchema,
query: &Query,
) -> impl Future<Output = Result<u64, ParseError>> + Send;
fn update(
&self,
schema: &ClassSchema,
query: &Query,
update: &Update,
) -> impl Future<Output = Result<u64, ParseError>> + Send;
fn update_one_returning(
&self,
schema: &ClassSchema,
query: &Query,
update: &Update,
) -> impl Future<Output = Result<Option<Row>, ParseError>> + Send;
fn delete(
&self,
schema: &ClassSchema,
query: &Query,
) -> impl Future<Output = Result<u64, ParseError>> + Send;
fn ensure_index(
&self,
class_name: &str,
fields: &[&str],
name: Option<&str>,
unique: bool,
case_insensitive: bool,
) -> impl Future<Output = Result<(), ParseError>> + Send;
fn create_indexes(
&self,
class_name: &str,
indexes: &[SchemaIndex],
) -> impl Future<Output = Result<(), ParseError>> + Send;
fn drop_index(
&self,
class_name: &str,
name: &str,
) -> impl Future<Output = Result<(), ParseError>> + Send;
}
#[derive(Debug, Clone)]
pub struct SchemaIndex {
pub name: String,
pub keys: Vec<(String, ParseValue)>,
}