improve getting export record types

This commit is contained in:
vms
2020-11-09 06:14:07 +03:00
parent 0ab1a1a2c3
commit b4d4364a6a
13 changed files with 69 additions and 60 deletions

8
Cargo.lock generated
View File

@ -648,7 +648,7 @@ dependencies = [
[[package]]
name = "fce"
version = "0.1.10"
version = "0.1.11"
dependencies = [
"boolinator",
"bytes",
@ -750,7 +750,7 @@ dependencies = [
[[package]]
name = "fluence-app-service"
version = "0.1.11"
version = "0.1.12"
dependencies = [
"fluence-faas",
"log",
@ -764,7 +764,7 @@ dependencies = [
[[package]]
name = "fluence-faas"
version = "0.1.11"
version = "0.1.12"
dependencies = [
"cmd_lib",
"env_logger 0.7.1",
@ -884,7 +884,7 @@ dependencies = [
[[package]]
name = "frepl"
version = "0.1.15"
version = "0.1.16"
dependencies = [
"anyhow",
"clap",

View File

@ -15,7 +15,7 @@ fce-wit-parser = { path = "../wit-parser", version = "0.1.10"}
fluence-sdk-wit = "0.2.8"
walrus = "0.17.0"
wasmer-wit = { package = "wasmer-interface-types-fl", version = "=0.17.17" }
wasmer-wit = { package = "wasmer-interface-types-fl", version = "0.17.17" }
once_cell = "1.4.0"
serde = { version = "1.0.110", features = ["derive"] }
serde_json = "1.0.56"

View File

@ -11,5 +11,5 @@ name = "fce_wit_interfaces"
path = "src/lib.rs"
[dependencies]
wasmer-wit = { package = "wasmer-interface-types-fl", version = "=0.17.17" }
wasmer-wit = { package = "wasmer-interface-types-fl", version = "0.17.17" }
multimap = "0.8.1"

View File

@ -16,4 +16,4 @@ fce-wit-interfaces = { path = "../wit-interfaces", version = "0.1.8" }
anyhow = "1.0.31"
walrus = "0.17.0"
wasmer-core = { package = "wasmer-runtime-core-fl", version = "0.17.0"}
wasmer-wit = { package = "wasmer-interface-types-fl", version = "=0.17.17" }
wasmer-wit = { package = "wasmer-interface-types-fl", version = "0.17.17" }

View File

@ -1,7 +1,7 @@
[package]
name = "fce"
description = "Fluence Compute Engine"
version = "0.1.10"
version = "0.1.11"
authors = ["Fluence Labs"]
license = "Apache-2.0"
edition = "2018"
@ -18,7 +18,7 @@ fce-utils = { path = "../crates/utils", version = "0.1.0" }
wasmer-runtime = { package = "wasmer-runtime-fl", version = "0.17.0" }
# dynamicfunc-fat-closures allows using state inside DynamicFunc
wasmer-core = { package = "wasmer-runtime-core-fl", version = "0.17.0", features = ["dynamicfunc-fat-closures"] }
wasmer-wit = { package = "wasmer-interface-types-fl", version = "=0.17.17" }
wasmer-wit = { package = "wasmer-interface-types-fl", version = "0.17.17" }
wasmer-wasi = { package = "wasmer-wasi-fl", version = "0.17.0" }
multimap = "0.8.1"

View File

@ -439,55 +439,62 @@ impl FCEModule {
export_funcs: &ExportFunctions,
wit_instance: &Arc<WITInstance>,
) -> Result<RecordTypes> {
fn handle_record_type(
record_type_id: u64,
fn handle_itype(
itype: &IType,
wit_instance: &Arc<WITInstance>,
export_record_types: &mut RecordTypes,
) -> Result<()> {
use wasmer_wit::interpreter::wasm::structures::Instance;
let record_type = wit_instance
.wit_record_by_id(record_type_id)
.ok_or_else(|| {
FCEError::WasmerResolveError(format!(
"record type with type id {} not found",
record_type_id
))
})?;
export_record_types.insert(record_type_id, record_type.clone());
fn handle_record_type(
record_type_id: u64,
wit_instance: &Arc<WITInstance>,
export_record_types: &mut RecordTypes,
) -> Result<()> {
let record_type =
wit_instance
.wit_record_by_id(record_type_id)
.ok_or_else(|| {
FCEError::WasmerResolveError(format!(
"record type with type id {} not found",
record_type_id
))
})?;
export_record_types.insert(record_type_id, record_type.clone());
for field in record_type.fields.iter() {
if let IType::Record(record_type_id) = &field.ty {
handle_record_type(*record_type_id, wit_instance, export_record_types)?;
for field in record_type.fields.iter() {
handle_itype(&field.ty, wit_instance, export_record_types)?;
}
Ok(())
}
match itype {
IType::Record(record_type_id) => {
handle_record_type(*record_type_id, wit_instance, export_record_types)?
}
IType::Array(array_ty) => {
handle_itype(array_ty, wit_instance, export_record_types)?
}
_ => {}
}
Ok(())
}
fn extract_record_type_from_itype(itype: &IType) -> Option<u64> {
match itype {
IType::Record(record_id) => Some(*record_id),
IType::Array(itype) => extract_record_type_from_itype(itype),
_ => None,
}
}
let export_record_ids = export_funcs
.iter()
.flat_map(|(_, ref mut callable)| {
callable
.wit_module_func
.arguments
.iter()
.map(|arg| &arg.ty)
.chain(callable.wit_module_func.output_types.iter())
})
.filter_map(extract_record_type_from_itype);
let mut export_record_types = HashMap::new();
for record_type_id in export_record_ids {
handle_record_type(record_type_id, wit_instance, &mut export_record_types)?;
let itypes = export_funcs.iter().flat_map(|(_, ref mut callable)| {
callable
.wit_module_func
.arguments
.iter()
.map(|arg| &arg.ty)
.chain(callable.wit_module_func.output_types.iter())
});
for itype in itypes {
handle_itype(itype, wit_instance, &mut export_record_types)?;
}
Ok(export_record_types)

View File

@ -6,5 +6,5 @@ fce build --release
rm artifacts/*
cp ../../target/wasm32-wasi/release/sqlite_test.wasm artifacts/
wget https://github.com/fluencelabs/sqlite/releases/download/v0.7.0_w/sqlite3.wasm
wget https://github.com/fluencelabs/sqlite/releases/download/v0.8.0_w/sqlite3.wasm
mv sqlite3.wasm artifacts/

View File

@ -21,7 +21,7 @@ use fce_sqlite_connector::State;
pub fn main() {}
#[fce]
pub fn test1() {
pub fn test1(age: i64) {
let connection = fce_sqlite_connector::open(":memory:").unwrap();
connection
@ -38,7 +38,7 @@ pub fn test1() {
.prepare("SELECT * FROM users WHERE age > ?")
.unwrap();
statement.bind(1, 50).unwrap();
statement.bind(1, age).unwrap();
while let State::Row = statement.next().unwrap() {
println!("name = {}", statement.read::<String>(0).unwrap());
@ -47,7 +47,7 @@ pub fn test1() {
}
#[fce]
pub fn test2() {
pub fn test2(age: i64) {
use fce_sqlite_connector::Value;
let connection = fce_sqlite_connector::open(":memory:").unwrap();
@ -67,7 +67,7 @@ pub fn test2() {
.unwrap()
.cursor();
cursor.bind(&[Value::Integer(50)]).unwrap();
cursor.bind(&[Value::Integer(age)]).unwrap();
while let Some(row) = cursor.next().unwrap() {
println!("name = {}", row[0].as_string().unwrap());
@ -77,7 +77,7 @@ pub fn test2() {
#[fce]
pub fn test3() {
let db_path = "/tmp/users.sqlite";
let db_path = "/var/folders/ww/v__xg0cj17x7h7sf3bgwpx8h0000gn/T/4589ab6f-5440-4933-ace5-a62714784142/tmp/users.sqlite";
let connection = fce_sqlite_connector::open(db_path).unwrap();
let execute_result = connection.execute(

View File

@ -1,13 +1,13 @@
[package]
name = "fluence-app-service"
description = "Fluence Application Service"
version = "0.1.11"
version = "0.1.12"
authors = ["Fluence Labs"]
license = "Apache-2.0"
edition = "2018"
[dependencies]
fluence-faas = { path = "../fluence-faas", version = "0.1.11" }
fluence-faas = { path = "../fluence-faas", version = "0.1.12" }
maplit = "1.0.2"
log = "0.4.8"

View File

@ -1,13 +1,13 @@
[package]
name = "fluence-faas"
description = "Fluence FaaS"
version = "0.1.11"
version = "0.1.12"
authors = ["Fluence Labs"]
license = "Apache-2.0"
edition = "2018"
[dependencies]
fce = { path = "../engine", version = "0.1.10" }
fce = { path = "../engine", version = "0.1.11" }
fce-utils = { path = "../crates/utils", version = "0.1.0" }
fluence-sdk-main = "=0.2.8"
@ -15,7 +15,7 @@ wasmer-runtime = { package = "wasmer-runtime-fl", version = "0.17.0" }
# dynamicfunc-fat-closures allows using state inside DynamicFunc
wasmer-core = { package = "wasmer-runtime-core-fl", version = "0.17.0", features = ["dynamicfunc-fat-closures"] }
wasmer-wasi = { package = "wasmer-wasi-fl", version = "0.17.0" }
wasmer-wit = { package = "wasmer-interface-types-fl", version = "=0.17.17" }
wasmer-wit = { package = "wasmer-interface-types-fl", version = "0.17.17" }
toml = "0.5.6"
serde = { version = "1.0.111", features = ["derive"] }

View File

@ -36,7 +36,7 @@ pub struct FaaSInterface<'a> {
impl<'a> fmt::Display for FaaSInterface<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let type_text_view = |arg_ty: &IType, record_types: &RecordTypes| {
fn type_text_view(arg_ty: &IType, record_types: &RecordTypes) -> String {
match arg_ty {
IType::Record(record_type_id) => {
// unwrap is safe because FaaSInterface here is well-formed
@ -44,7 +44,9 @@ impl<'a> fmt::Display for FaaSInterface<'a> {
let record = record_types.get(record_type_id).unwrap();
record.name.clone()
}
IType::Array(array_ty) => format!("Array<{:?}>", array_ty),
IType::Array(array_ty) => {
format!("Array<{}>", type_text_view(array_ty, record_types))
}
t => format!("{:?}", t),
}
};

View File

@ -1,7 +1,7 @@
[package]
name = "frepl"
description = "Fluence FCE REPL intended for testing purposes"
version = "0.1.15"
version = "0.1.16"
authors = ["Fluence Labs"]
repository = "https://github.com/fluencelabs/fce/tools/repl"
license = "Apache-2.0"
@ -12,7 +12,7 @@ name = "fce-repl"
path = "src/main.rs"
[dependencies]
fluence-app-service = { path = "../../fluence-app-service", version = "0.1.10", features = ["raw-module-api"] }
fluence-app-service = { path = "../../fluence-app-service", version = "0.1.12", features = ["raw-module-api"] }
anyhow = "1.0.31"
clap = "2.33.1"