From 3580e429c320cee0e59d581b2c08eb177d898ce1 Mon Sep 17 00:00:00 2001 From: vms Date: Thu, 8 Apr 2021 12:38:24 +0300 Subject: [PATCH] initial version of build time support --- Cargo.toml | 1 + crates/main/Cargo.toml | 3 ++- crates/main/src/module_manifest.rs | 9 +++++-- crates/timestamp-macro/Cargo.toml | 18 +++++++++++++ crates/timestamp-macro/src/lib.rs | 41 ++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 crates/timestamp-macro/Cargo.toml create mode 100644 crates/timestamp-macro/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index c36734b..78a194c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ members = [ "crates/fce-test-macro", "crates/fce-test-macro-impl", "crates/main", + "crates/timestamp-macro", "crates/wit", "fluence", "fluence-test" diff --git a/crates/main/Cargo.toml b/crates/main/Cargo.toml index 0ad43c8..7dad52d 100644 --- a/crates/main/Cargo.toml +++ b/crates/main/Cargo.toml @@ -19,7 +19,8 @@ crate-type = ["rlib"] doctest = false [dependencies] -fluence-sdk-macro = { path = "../fce-macro", version = "=0.5.0" } +fluence-sdk-macro = { path = "../fce-macro", version = "0.5.0" } +fce-timestamp-macro = { path = "../timestamp-macro", version = "0.5.0" } log = { version = "0.4.8", features = ["std"] } serde = "=1.0.118" diff --git a/crates/main/src/module_manifest.rs b/crates/main/src/module_manifest.rs index 003864e..66458bb 100644 --- a/crates/main/src/module_manifest.rs +++ b/crates/main/src/module_manifest.rs @@ -20,17 +20,21 @@ pub const MANIFEST_SECTION_NAME: &str = "__fluence_wasm_module_manifest"; #[macro_export] macro_rules! module_manifest { ($authors:expr, $version:expr, $description:expr, $repository:expr) => { + fce_timestamp_macro::build_timestamp!(); + const __FCE_SDK_AUTHORS_SIZE: usize = $authors.as_bytes().len(); const __FCE_SDK_VERSION_SIZE: usize = $version.as_bytes().len(); const __FCE_SDK_DESCRIPTION_SIZE: usize = $description.as_bytes().len(); const __FCE_SDK_REPOSITORY_SIZE: usize = $repository.as_bytes().len(); + const __FCE_SDK_BUILD_TIME_SIZE: usize = __FCE_SDK_BUILD_TIME.as_bytes().len(); const __FCE_SDK_FIELD_PREFIX_SIZE: usize = std::mem::size_of::(); const __FCE_MANIFEST_SIZE: usize = __FCE_SDK_AUTHORS_SIZE + __FCE_SDK_VERSION_SIZE + __FCE_SDK_DESCRIPTION_SIZE + __FCE_SDK_REPOSITORY_SIZE - + __FCE_SDK_FIELD_PREFIX_SIZE * 4; + + __FCE_SDK_BUILD_TIME_SIZE + + __FCE_SDK_FIELD_PREFIX_SIZE * 5; const fn __fce_sdk_append_data( mut manifest: [u8; __FCE_MANIFEST_SIZE], @@ -66,7 +70,8 @@ macro_rules! module_manifest { let (manifest, offset) = __fce_sdk_append_data(manifest, $authors, offset); let (manifest, offset) = __fce_sdk_append_data(manifest, $version, offset); let (manifest, offset) = __fce_sdk_append_data(manifest, $description, offset); - let (manifest, _) = __fce_sdk_append_data(manifest, $repository, offset); + let (manifest, offset) = __fce_sdk_append_data(manifest, $repository, offset); + let (manifest, _) = __fce_sdk_append_data(manifest, __FCE_SDK_BUILD_TIME, offset); manifest } diff --git a/crates/timestamp-macro/Cargo.toml b/crates/timestamp-macro/Cargo.toml new file mode 100644 index 0000000..983bf61 --- /dev/null +++ b/crates/timestamp-macro/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "fce-timestamp-macro" +version = "0.5.0" # remember to update html_root_url +edition = "2018" +description = "Implementation of the `#[build_timestamp]` macro" +repository = "https://github.com/fluencelabs/rust-sdk/crates/timestamp-macro" +authors = ["Fluence Labs"] +keywords = ["fluence", "sdk", "webassembly", "procedural_macros"] +categories = ["api-bindings", "wasm"] +license = "Apache-2.0" + +[lib] +proc-macro = true +doctest = false + +[dependencies] +syn = { version = '1.0.64', features = ['full'] } +chrono = "0.4.19" diff --git a/crates/timestamp-macro/src/lib.rs b/crates/timestamp-macro/src/lib.rs new file mode 100644 index 0000000..9beedc6 --- /dev/null +++ b/crates/timestamp-macro/src/lib.rs @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#![deny( + dead_code, + nonstandard_style, + unused_imports, + unused_mut, + unused_variables, + unused_unsafe, + unreachable_patterns +)] +#![warn(rust_2018_idioms)] +#![recursion_limit = "1024"] + +use proc_macro::TokenStream; + +const FORMAT_STRING: &str = "%H:%M:%S / %Y-%m-%d"; + +#[proc_macro] +pub fn build_timestamp(_: TokenStream) -> TokenStream { + let time = chrono::Utc::now(); + let formatted_time = time.format(FORMAT_STRING); + + let out_str = format!(r#"const __FCE_SDK_BUILD_TIME: &str = {}"#, formatted_time); + + out_str.parse().expect("time formatting should be correct") +}