This commit is contained in:
vms 2021-03-28 22:51:50 +03:00
parent 287090ae5a
commit e4c7ed319b
10 changed files with 121 additions and 116 deletions

View File

@ -1,43 +1,9 @@
[package]
name = "fluence"
version = "0.5.0" # remember to update html_root_url
description = "Fluence backend SDK for developing backend applications for the Fluence network"
documentation = "https://docs.rs/fluence/"
repository = "https://github.com/fluencelabs/rust-sdk"
authors = ["Fluence Labs"]
readme = "README.md"
keywords = ["fluence", "sdk", "webassembly"]
categories = ["api-bindings", "wasm"]
license = "Apache-2.0"
edition = "2018"
[package.metadata.docs.rs] # https://docs.rs/about
all-features = true
[lib]
path = "src/lib.rs"
[dependencies]
fluence-sdk-macro = { path = "crates/fce-macro", version = "=0.5.0" }
fluence-sdk-test-macro = { path = "crates/fce-test-macro", version = "=0.5.0", optional = true }
fluence-sdk-main = { path = "crates/main", version = "=0.5.0" }
fluence-app-service= { version = "0.5.2", features = ["raw-module-api"], optional = true }
[features]
# Print some internal logs by log_utf8_string
debug = ["fluence-sdk-main/debug"]
# Enable logger (this will cause log_utf8_string to appear in imports)
logger = ["fluence-sdk-main/logger"]
# Enable the fce-test features (it'll bring fluence-app-service as a dependency)
fce-test = ["fluence-sdk-test-macro", "fluence-app-service"]
[workspace] [workspace]
members = [ members = [
"crates/fce-macro", "crates/fce-macro",
"crates/fce-test-macro", "crates/fce-test-macro",
"crates/main", "crates/main",
"crates/wit", "crates/wit",
"fluence",
"fluence-test"
] ]

View File

@ -18,7 +18,6 @@ proc-macro = true
[dependencies] [dependencies]
quote = "1.0.9" quote = "1.0.9"
proc-macro2 = "1.0.24" proc-macro2 = "1.0.24"
serde = { version = "=1.0.118", features = ["derive"] }
serde_json = "1.0.56"
syn = { version = '1.0.64', features = ['full'] } syn = { version = '1.0.64', features = ['full'] }
uuid = { version = "0.8.2", features = ["v4"] } uuid = { version = "0.8.2", features = ["v4"] }
darling = "0.12.2"

View File

@ -14,48 +14,9 @@
* limitations under the License. * limitations under the License.
*/ */
use syn::parse::Parse; use darling::FromMeta;
use syn::parse::ParseStream;
#[derive(Debug, Default, Clone)] #[derive(Debug, Default, Clone, FromMeta)]
pub(crate) struct FCETestAttributes { pub(crate) struct FCETestAttributes {
pub(crate) config_path: String, pub(crate) config_path: String,
} }
impl Parse for FCETestAttributes {
fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
let config_file_path = parse_config_file_path(input)?;
let attributes = FCETestAttributes {
config_path: config_file_path,
};
Ok(attributes)
}
}
pub(crate) fn parse_config_file_path(token_stream: ParseStream<'_>) -> syn::Result<String> {
let attr_name = token_stream.step(|cursor| match cursor.ident() {
Some((ident, rem)) => Ok((ident, rem)),
None => Err(cursor.error("Expected a valid identifier")),
})?;
match attr_name.to_string().as_str() {
"config" => {
// trying to parse `=`
token_stream.parse::<syn::token::Eq>()?;
match token_stream.parse::<syn::Ident>() {
Ok(config_file_path) => Ok(config_file_path.to_string()),
Err(e) => Err(syn::Error::new(
attr_name.span(),
format!("failed to parse a config file path: {}", e),
)),
}
}
attr => Err(syn::Error::new(
attr_name.span(),
format!("Expected 'config' identifier, but {} found", attr),
)),
}
}

View File

@ -14,22 +14,27 @@
* limitations under the License. * limitations under the License.
*/ */
use proc_macro2::TokenStream; use crate::attributes::FCETestAttributes;
use proc_macro::TokenStream;
use proc_macro2::TokenStream as TokenStream2;
use quote::quote; use quote::quote;
pub(super) fn fce_test_impl( pub(super) fn fce_test_impl(attrs: TokenStream, func_input: syn::ItemFn) -> TokenStream {
attr: TokenStream, use darling::FromMeta;
func_input: syn::ItemFn,
) -> Result<TokenStream, TokenStream> {
use crate::attributes::FCETestAttributes;
let attrs = syn::parse2::<FCETestAttributes>(attr).map_err(|e| e.into_compile_error())?; let attrs = syn::parse_macro_input!(attrs as syn::AttributeArgs);
let generated_test = generate_test_glue_code(func_input, &attrs.config_path); let attrs = match FCETestAttributes::from_list(&attrs) {
Ok(v) => v,
Err(e) => {
return TokenStream::from(e.write_errors());
}
};
Ok(generated_test) generate_test_glue_code(func_input, &attrs.config_path).into()
} }
fn generate_test_glue_code(func: syn::ItemFn, config_path: &str) -> TokenStream { fn generate_test_glue_code(func: syn::ItemFn, config_path: &str) -> TokenStream2 {
let fce_ctor = generate_fce_ctor(config_path); let fce_ctor = generate_fce_ctor(config_path);
let original_block = func.block; let original_block = func.block;
let signature = func.sig; let signature = func.sig;
@ -44,27 +49,23 @@ fn generate_test_glue_code(func: syn::ItemFn, config_path: &str) -> TokenStream
} }
} }
fn generate_fce_ctor(config_path: &str) -> TokenStream { fn generate_fce_ctor(config_path: &str) -> TokenStream2 {
let config_path = new_ident(config_path); let config_path = quote! { #config_path };
let tmp_file_path = std::env::temp_dir(); let tmp_file_path = std::env::temp_dir();
let random_uuid = uuid::Uuid::new_v4().to_string(); let random_uuid = uuid::Uuid::new_v4().to_string();
let service_id = new_ident(&random_uuid); let service_id = quote! { #random_uuid };
let tmp_file_path = tmp_file_path.join(random_uuid); let tmp_file_path = tmp_file_path.join(random_uuid);
let tmp_file_path = tmp_file_path.to_string_lossy().to_string(); let tmp_file_path = tmp_file_path.to_string_lossy().to_string();
let tmp_file_path = new_ident(&tmp_file_path); let tmp_file_path = quote! { #tmp_file_path };
quote! { quote! {
let mut __fce__generated_fce_config = fluence::internal::test::TomlAppServiceConfig::load(#config_path) let mut __fce__generated_fce_config = fluence_test::internal::TomlAppServiceConfig::load(#config_path.to_string())
.unwrap_or_else(|e| panic!("app service located at `{}` config can't be loaded: {}", #config_path, e)); .unwrap_or_else(|e| panic!("app service located at `{}` config can't be loaded: {}", #config_path, e));
__fce__generated_fce_config.service_base_dir = Some(#tmp_file_path); __fce__generated_fce_config.service_base_dir = Some(#tmp_file_path.to_string());
let fce = fluence::internal::test::AppService::new_with_empty_facade(__fce__generated_fce_config, #service_id, std::collections::HashMap::new()) let mut fce = fluence_test::internal::AppService::new_with_empty_facade(__fce__generated_fce_config, #service_id, std::collections::HashMap::new())
.unwrap_or_else(|e| panic!("app service can't be created: {}", e)); .unwrap_or_else(|e| panic!("app service can't be created: {}", e));
} }
} }
fn new_ident(name: &str) -> syn::Ident {
syn::Ident::new(name, proc_macro2::Span::call_site())
}

View File

@ -15,16 +15,15 @@
*/ */
#![doc(html_root_url = "https://docs.rs/fluence-sdk-macro/0.4.2")] #![doc(html_root_url = "https://docs.rs/fluence-sdk-macro/0.4.2")]
/*
#![deny( #![deny(
dead_code, dead_code,
nonstandard_style, nonstandard_style,
unused_imports, unused_imports,
unused_mut, unused_mut,
unused_variables,
unused_unsafe, unused_unsafe,
unreachable_patterns unreachable_patterns
)] )]
*/
#![warn(rust_2018_idioms)] #![warn(rust_2018_idioms)]
#![recursion_limit = "1024"] #![recursion_limit = "1024"]
@ -56,7 +55,5 @@ use proc_macro::TokenStream;
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn fce_test(attrs: TokenStream, input: TokenStream) -> TokenStream { pub fn fce_test(attrs: TokenStream, input: TokenStream) -> TokenStream {
let func_input = syn::parse_macro_input!(input as syn::ItemFn); let func_input = syn::parse_macro_input!(input as syn::ItemFn);
let result = fce_test_impl(attrs.into(), func_input).unwrap_or_else(std::convert::identity); fce_test_impl(attrs.into(), func_input)
result.into()
} }

View File

@ -32,7 +32,7 @@ macro_rules! module_manifest {
+ __FCE_SDK_REPOSITORY_SIZE + __FCE_SDK_REPOSITORY_SIZE
+ __FCE_SDK_FIELD_PREFIX_SIZE * 4; + __FCE_SDK_FIELD_PREFIX_SIZE * 4;
const fn append_data( const fn __fce_sdk_append_data(
mut manifest: [u8; __FCE_MANIFEST_SIZE], mut manifest: [u8; __FCE_MANIFEST_SIZE],
data: &'static str, data: &'static str,
offset: usize, offset: usize,
@ -63,10 +63,10 @@ macro_rules! module_manifest {
let manifest: [u8; __FCE_MANIFEST_SIZE] = [0; __FCE_MANIFEST_SIZE]; let manifest: [u8; __FCE_MANIFEST_SIZE] = [0; __FCE_MANIFEST_SIZE];
let offset = 0; let offset = 0;
let (manifest, offset) = append_data(manifest, $authors, offset); let (manifest, offset) = __fce_sdk_append_data(manifest, $authors, offset);
let (manifest, offset) = append_data(manifest, $version, offset); let (manifest, offset) = __fce_sdk_append_data(manifest, $version, offset);
let (manifest, offset) = append_data(manifest, $description, offset); let (manifest, offset) = __fce_sdk_append_data(manifest, $description, offset);
let (manifest, _) = append_data(manifest, $repository, offset); let (manifest, _) = __fce_sdk_append_data(manifest, $repository, offset);
manifest manifest
} }

22
fluence-test/Cargo.toml Normal file
View File

@ -0,0 +1,22 @@
[package]
name = "fluence-test"
version = "0.5.0" # remember to update html_root_url
description = "Fluence backend SDK for testing"
documentation = "https://docs.rs/fluence/"
repository = "https://github.com/fluencelabs/rust-sdk"
authors = ["Fluence Labs"]
readme = "README.md"
keywords = ["fluence", "sdk", "webassembly"]
categories = ["api-bindings", "wasm"]
license = "Apache-2.0"
edition = "2018"
[package.metadata.docs.rs] # https://docs.rs/about
all-features = true
[lib]
path = "src/lib.rs"
[dependencies]
fluence-sdk-test-macro = { path = "../crates/fce-test-macro", version = "=0.5.0" }
fluence-app-service= { version = "0.5.2", features = ["raw-module-api"] }

36
fluence-test/src/lib.rs Normal file
View File

@ -0,0 +1,36 @@
/*
* Copyright 2020 Fluence Labs Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#![doc(html_root_url = "https://docs.rs/fluence/0.5.0")]
#![deny(
dead_code,
nonstandard_style,
unused_imports,
unused_mut,
unused_variables,
unused_unsafe,
unreachable_patterns
)]
#![warn(rust_2018_idioms)]
pub use fluence_sdk_test_macro::fce_test;
/// These API functions are intended for internal usage in generated code.
/// Normally, you shouldn't use them.
pub mod internal {
pub use fluence_app_service::AppService;
pub use fluence_app_service::TomlAppServiceConfig;
}

29
fluence/Cargo.toml Normal file
View File

@ -0,0 +1,29 @@
[package]
name = "fluence"
version = "0.5.0" # remember to update html_root_url
description = "Fluence backend SDK for developing backend applications for the Fluence network"
documentation = "https://docs.rs/fluence/"
repository = "https://github.com/fluencelabs/rust-sdk"
authors = ["Fluence Labs"]
readme = "README.md"
keywords = ["fluence", "sdk", "webassembly"]
categories = ["api-bindings", "wasm"]
license = "Apache-2.0"
edition = "2018"
[package.metadata.docs.rs] # https://docs.rs/about
all-features = true
[lib]
path = "src/lib.rs"
[dependencies]
fluence-sdk-macro = { path = "../crates/fce-macro", version = "=0.5.0" }
fluence-sdk-main = { path = "../crates/main", version = "=0.5.0" }
[features]
# Print some internal logs by log_utf8_string
debug = ["fluence-sdk-main/debug"]
# Enable logger (this will cause log_utf8_string to appear in imports)
logger = ["fluence-sdk-main/logger"]

View File

@ -94,10 +94,4 @@ pub mod internal {
pub use fluence_sdk_main::get_result_size; pub use fluence_sdk_main::get_result_size;
pub use fluence_sdk_main::set_result_ptr; pub use fluence_sdk_main::set_result_ptr;
pub use fluence_sdk_main::set_result_size; pub use fluence_sdk_main::set_result_size;
#[cfg(feature = "fce-test")]
pub mod test {
pub use fluence_app_service::AppService;
pub use fluence_app_service::AppServiceConfig;
}
} }