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

View File

@ -15,7 +15,7 @@ fce-wit-parser = { path = "../wit-parser", version = "0.1.10"}
fluence-sdk-wit = "0.2.8" fluence-sdk-wit = "0.2.8"
walrus = "0.17.0" 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" once_cell = "1.4.0"
serde = { version = "1.0.110", features = ["derive"] } serde = { version = "1.0.110", features = ["derive"] }
serde_json = "1.0.56" serde_json = "1.0.56"

View File

@ -11,5 +11,5 @@ name = "fce_wit_interfaces"
path = "src/lib.rs" path = "src/lib.rs"
[dependencies] [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" multimap = "0.8.1"

View File

@ -16,4 +16,4 @@ fce-wit-interfaces = { path = "../wit-interfaces", version = "0.1.8" }
anyhow = "1.0.31" anyhow = "1.0.31"
walrus = "0.17.0" walrus = "0.17.0"
wasmer-core = { package = "wasmer-runtime-core-fl", version = "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] [package]
name = "fce" name = "fce"
description = "Fluence Compute Engine" description = "Fluence Compute Engine"
version = "0.1.10" version = "0.1.11"
authors = ["Fluence Labs"] authors = ["Fluence Labs"]
license = "Apache-2.0" license = "Apache-2.0"
edition = "2018" 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" } wasmer-runtime = { package = "wasmer-runtime-fl", version = "0.17.0" }
# dynamicfunc-fat-closures allows using state inside DynamicFunc # dynamicfunc-fat-closures allows using state inside DynamicFunc
wasmer-core = { package = "wasmer-runtime-core-fl", version = "0.17.0", features = ["dynamicfunc-fat-closures"] } 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" } wasmer-wasi = { package = "wasmer-wasi-fl", version = "0.17.0" }
multimap = "0.8.1" multimap = "0.8.1"

View File

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

View File

@ -6,5 +6,5 @@ fce build --release
rm artifacts/* rm artifacts/*
cp ../../target/wasm32-wasi/release/sqlite_test.wasm 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/ mv sqlite3.wasm artifacts/

View File

@ -21,7 +21,7 @@ use fce_sqlite_connector::State;
pub fn main() {} pub fn main() {}
#[fce] #[fce]
pub fn test1() { pub fn test1(age: i64) {
let connection = fce_sqlite_connector::open(":memory:").unwrap(); let connection = fce_sqlite_connector::open(":memory:").unwrap();
connection connection
@ -38,7 +38,7 @@ pub fn test1() {
.prepare("SELECT * FROM users WHERE age > ?") .prepare("SELECT * FROM users WHERE age > ?")
.unwrap(); .unwrap();
statement.bind(1, 50).unwrap(); statement.bind(1, age).unwrap();
while let State::Row = statement.next().unwrap() { while let State::Row = statement.next().unwrap() {
println!("name = {}", statement.read::<String>(0).unwrap()); println!("name = {}", statement.read::<String>(0).unwrap());
@ -47,7 +47,7 @@ pub fn test1() {
} }
#[fce] #[fce]
pub fn test2() { pub fn test2(age: i64) {
use fce_sqlite_connector::Value; use fce_sqlite_connector::Value;
let connection = fce_sqlite_connector::open(":memory:").unwrap(); let connection = fce_sqlite_connector::open(":memory:").unwrap();
@ -67,7 +67,7 @@ pub fn test2() {
.unwrap() .unwrap()
.cursor(); .cursor();
cursor.bind(&[Value::Integer(50)]).unwrap(); cursor.bind(&[Value::Integer(age)]).unwrap();
while let Some(row) = cursor.next().unwrap() { while let Some(row) = cursor.next().unwrap() {
println!("name = {}", row[0].as_string().unwrap()); println!("name = {}", row[0].as_string().unwrap());
@ -77,7 +77,7 @@ pub fn test2() {
#[fce] #[fce]
pub fn test3() { 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 connection = fce_sqlite_connector::open(db_path).unwrap();
let execute_result = connection.execute( let execute_result = connection.execute(

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
[package] [package]
name = "frepl" name = "frepl"
description = "Fluence FCE REPL intended for testing purposes" description = "Fluence FCE REPL intended for testing purposes"
version = "0.1.15" version = "0.1.16"
authors = ["Fluence Labs"] authors = ["Fluence Labs"]
repository = "https://github.com/fluencelabs/fce/tools/repl" repository = "https://github.com/fluencelabs/fce/tools/repl"
license = "Apache-2.0" license = "Apache-2.0"
@ -12,7 +12,7 @@ name = "fce-repl"
path = "src/main.rs" path = "src/main.rs"
[dependencies] [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" anyhow = "1.0.31"
clap = "2.33.1" clap = "2.33.1"