more json schema

This commit is contained in:
John Smith 2023-06-04 22:08:46 -04:00
parent 06081df22a
commit 0e52c1fb0a
7 changed files with 159 additions and 13 deletions

View File

@ -295,4 +295,12 @@ impl VeilidAPI {
pub async fn cancel_tunnel(&self, _tunnel_id: TunnelId) -> VeilidAPIResult<bool> { pub async fn cancel_tunnel(&self, _tunnel_id: TunnelId) -> VeilidAPIResult<bool> {
panic!("unimplemented"); panic!("unimplemented");
} }
////////////////////////////////////////////////////////////////
// JSON API
#[instrument(level = "debug", skip(self))]
pub async fn json_request(&self, request: json_api::Request) -> json_api::Response {
panic!("unimplemented");
}
} }

View File

@ -19,6 +19,13 @@ pub struct Request {
op: RequestOp, op: RequestOp,
} }
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "type")]
pub enum RecvMessage {
Response(Response),
Update(VeilidUpdate),
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] #[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct Response { pub struct Response {
/// Operation Id (pairs with Request, or empty if unidirectional) /// Operation Id (pairs with Request, or empty if unidirectional)
@ -72,6 +79,7 @@ pub enum RequestOp {
name: String, name: String,
}, },
TableDb(TableDbRequest), TableDb(TableDbRequest),
TableDbTransaction(TableDbTransactionRequest),
// Crypto // Crypto
GetCryptoSystem { GetCryptoSystem {
#[schemars(with = "String")] #[schemars(with = "String")]
@ -120,9 +128,6 @@ pub struct NewPrivateRouteResult {
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] #[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "op")] #[serde(tag = "op")]
pub enum ResponseOp { pub enum ResponseOp {
Update {
value: VeilidUpdate,
},
GetState { GetState {
#[serde(flatten)] #[serde(flatten)]
result: ApiResult<VeilidState>, result: ApiResult<VeilidState>,
@ -171,6 +176,7 @@ pub enum ResponseOp {
result: ApiResult<bool>, result: ApiResult<bool>,
}, },
TableDb(TableDbResponse), TableDb(TableDbResponse),
TableDbTransaction(TableDbTransactionResponse),
// Crypto // Crypto
GetCryptoSystem { GetCryptoSystem {
#[serde(flatten)] #[serde(flatten)]
@ -250,6 +256,25 @@ pub enum ApiResultWithVecU8 {
error: VeilidAPIError, error: VeilidAPIError,
}, },
} }
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(transparent)]
pub struct VecU8 {
#[serde(with = "json_as_base64")]
#[schemars(with = "String")]
value: Vec<u8>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(untagged)]
pub enum ApiResultWithVecVecU8 {
Ok {
#[schemars(with = "Vec<String>")]
value: Vec<VecU8>,
},
Err {
error: VeilidAPIError,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] #[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(untagged)] #[serde(untagged)]
@ -268,7 +293,7 @@ where
pub fn emit_schemas(out: &mut HashMap<String, String>) { pub fn emit_schemas(out: &mut HashMap<String, String>) {
let schema_request = schema_for!(Request); let schema_request = schema_for!(Request);
let schema_response = schema_for!(Response); let schema_recv_message = schema_for!(RecvMessage);
out.insert( out.insert(
"Request".to_owned(), "Request".to_owned(),
@ -276,7 +301,7 @@ pub fn emit_schemas(out: &mut HashMap<String, String>) {
); );
out.insert( out.insert(
"Response".to_owned(), "RecvMessage".to_owned(),
serde_json::to_string_pretty(&schema_response).unwrap(), serde_json::to_string_pretty(&schema_recv_message).unwrap(),
); );
} }

View File

@ -18,9 +18,118 @@ pub struct TableDbResponse {
#[serde(tag = "db_op")] #[serde(tag = "db_op")]
pub enum TableDbRequestOp { pub enum TableDbRequestOp {
Release, Release,
GetColumnCount,
GetKeys {
col: i32,
},
Transact,
Store {
col: i32,
#[serde(with = "json_as_base64")]
#[schemars(with = "String")]
key: Vec<u8>,
#[serde(with = "json_as_base64")]
#[schemars(with = "String")]
value: Vec<u8>,
},
Load {
col: i32,
#[serde(with = "json_as_base64")]
#[schemars(with = "String")]
key: Vec<u8>,
},
Delete {
col: i32,
#[serde(with = "json_as_base64")]
#[schemars(with = "String")]
key: Vec<u8>,
},
} }
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] #[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "db_op")] #[serde(tag = "db_op")]
pub enum TableDbResponseOp { pub enum TableDbResponseOp {
Release, Release,
GetColumnCount {
value: i32,
},
GetKeys {
#[serde(flatten)]
#[schemars(with = "ApiResult<Vec<String>>")]
result: ApiResultWithVecVecU8,
},
Transact {
value: String,
},
Store {
#[serde(flatten)]
result: ApiResult<()>,
},
Load {
#[serde(flatten)]
#[schemars(with = "ApiResult<Option<String>>")]
result: ApiResult<Option<VecU8>>,
},
Delete {
#[serde(flatten)]
#[schemars(with = "ApiResult<Option<String>>")]
result: ApiResult<Option<VecU8>>,
},
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct TableDbTransactionRequest {
tx_id: String,
#[serde(flatten)]
tx_op: TableDbTransactionRequestOp,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct TableDbTransactionResponse {
tx_id: String,
#[serde(flatten)]
tx_op: TableDbTransactionResponseOp,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "tx_op")]
pub enum TableDbTransactionRequestOp {
Commit,
Rollback,
Store {
col: i32,
#[serde(with = "json_as_base64")]
#[schemars(with = "String")]
key: Vec<u8>,
#[serde(with = "json_as_base64")]
#[schemars(with = "String")]
value: Vec<u8>,
},
Delete {
col: i32,
#[serde(with = "json_as_base64")]
#[schemars(with = "String")]
key: Vec<u8>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "tx_op")]
pub enum TableDbTransactionResponseOp {
Commit {
#[serde(flatten)]
result: ApiResult<()>,
},
Rollback {
#[serde(flatten)]
result: ApiResult<()>,
},
Store {
#[serde(flatten)]
result: ApiResult<()>,
},
Delete {
#[serde(flatten)]
result: ApiResult<()>,
},
} }

View File

@ -797,7 +797,7 @@ class VeilidTableDBTransactionFFI extends VeilidTableDBTransaction {
} }
@override @override
Future<bool> delete(int col, Uint8List key) { Future<void> delete(int col, Uint8List key) {
final nativeEncodedKey = base64UrlNoPadEncode(key).toNativeUtf8(); final nativeEncodedKey = base64UrlNoPadEncode(key).toNativeUtf8();
final recvPort = ReceivePort("veilid_table_db_transaction_delete"); final recvPort = ReceivePort("veilid_table_db_transaction_delete");
@ -888,7 +888,7 @@ class VeilidTableDBFFI extends VeilidTableDB {
} }
@override @override
Future<Uint8List?> delete(int col, Uint8List key) { Future<Uint8List?> delete(int col, Uint8List key) async {
final nativeEncodedKey = base64UrlNoPadEncode(key).toNativeUtf8(); final nativeEncodedKey = base64UrlNoPadEncode(key).toNativeUtf8();
final recvPort = ReceivePort("veilid_table_db_delete"); final recvPort = ReceivePort("veilid_table_db_delete");
@ -899,7 +899,11 @@ class VeilidTableDBFFI extends VeilidTableDB {
col, col,
nativeEncodedKey, nativeEncodedKey,
); );
return processFuturePlain(recvPort.first); String? out = await processFuturePlain(recvPort.first);
if (out == null) {
return null;
}
return base64UrlNoPadDecode(out);
} }
} }

View File

@ -368,7 +368,7 @@ class VeilidTableDBTransactionJS extends VeilidTableDBTransaction {
} }
@override @override
Future<bool> delete(int col, Uint8List key) { Future<void> delete(int col, Uint8List key) {
final encodedKey = base64UrlNoPadEncode(key); final encodedKey = base64UrlNoPadEncode(key);
return _wrapApiPromise(js_util.callMethod( return _wrapApiPromise(js_util.callMethod(

View File

@ -8,7 +8,7 @@ abstract class VeilidTableDBTransaction {
Future<void> commit(); Future<void> commit();
Future<void> rollback(); Future<void> rollback();
Future<void> store(int col, Uint8List key, Uint8List value); Future<void> store(int col, Uint8List key, Uint8List value);
Future<bool> delete(int col, Uint8List key); Future<void> delete(int col, Uint8List key);
Future<void> storeJson(int col, Uint8List key, Object? object, Future<void> storeJson(int col, Uint8List key, Object? object,
{Object? Function(Object? nonEncodable)? toEncodable}) async { {Object? Function(Object? nonEncodable)? toEncodable}) async {

View File

@ -908,8 +908,8 @@ pub extern "C" fn table_db_transaction_delete(port: i64, id: u32, col: u32, key:
tdbt.clone() tdbt.clone()
}; };
let out = tdbt.delete(col, &key); tdbt.delete(col, &key);
APIResult::Ok(out) APIRESULT_VOID
}); });
} }