From 79eaf7c7a04ba6589839b33b2d2be38e3acc150f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Wed, 1 May 2024 19:21:41 +0300 Subject: [PATCH 01/21] feat: add `CARGO_NEAR_...` vars into `ContractMetadata::populate` --- .../src/core_impl/contract_metadata/mod.rs | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs index 75a183133..4efc62a60 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs @@ -11,6 +11,11 @@ struct MacroConfig { pub(crate) struct ContractMetadata { version: Option, link: Option, + build_env: Option, + build_cmd: Option, + contract_path: Option, + source_commit: Option, + source_git_url: Option, #[darling(multiple, rename = "standard")] standards: Vec, } @@ -47,19 +52,24 @@ struct Standard { impl ContractMetadata { fn populate(mut self) -> Self { - if self.version.is_none() { - let version = std::env::var("CARGO_PKG_VERSION").unwrap_or(String::from("")); - if !version.is_empty() { - self.version = Some(version); - } + macro_rules! env_field { + ($field: ident, $key: expr) => { + if self.$field.is_none() { + let field_val = std::env::var($key).unwrap_or(String::from("")); + if !field_val.is_empty() { + self.$field = Some(field_val); + } + } + }; } - if self.link.is_none() { - let repo = std::env::var("CARGO_PKG_REPOSITORY").unwrap_or(String::from("")); - if !repo.is_empty() { - self.link = Some(repo); - } - } + env_field!(version, "CARGO_PKG_VERSION"); + env_field!(link, "CARGO_PKG_REPOSITORY"); + env_field!(build_env, "CARGO_NEAR_BUILD_ENVIRONMENT"); + env_field!(build_cmd, "CARGO_NEAR_BUILD_COMMAND"); + env_field!(contract_path, "CARGO_NEAR_CONTRACT_PATH"); + env_field!(source_commit, "CARGO_NEAR_SOURCE_CODE_COMMIT"); + env_field!(source_git_url, "CARGO_NEAR_SOURCE_CODE_GIT_URL"); // adding nep330 if it is not present if self.standards.is_empty() From 2b74dd74318f20a8fac539fa0717e2511c1888d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Thu, 2 May 2024 19:51:59 +0300 Subject: [PATCH 02/21] chore: extract `BuildInfo` as `ContractMetadata` field --- .../core_impl/contract_metadata/build_info.rs | 54 +++++++++++++++++++ .../src/core_impl/contract_metadata/mod.rs | 35 ++++++------ 2 files changed, 73 insertions(+), 16 deletions(-) create mode 100644 near-sdk-macros/src/core_impl/contract_metadata/build_info.rs diff --git a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs new file mode 100644 index 000000000..90c330d47 --- /dev/null +++ b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs @@ -0,0 +1,54 @@ +#[derive(serde::Serialize)] +pub(crate) struct BuildInfo { + build_environment: String, + build_command: Vec, + contract_path: Option, + // pub source_code_snapshot: String, + source_commit: String, + source_git_url: String, +} + +/// basic parsing errors +#[derive(Debug)] +pub(super) enum BuildInfoError { + EmptyBuildEnvironment, + EmptyBuildCommand, + /// `None` value should be used instead for `contract_path` + EmptyContractPath, + EmptySourceSnapshot, +} + +impl BuildInfo { + pub(super) fn from_env() -> Result { + let build_environment = std::env::var("CARGO_NEAR_BUILD_ENVIRONMENT") + .map_err(|_| BuildInfoError::EmptyBuildEnvironment)?; + if build_environment.is_empty() { + return Err(BuildInfoError::EmptyBuildEnvironment); + } + let build_command = std::env::var("CARGO_NEAR_BUILD_COMMAND") + .map_err(|_| BuildInfoError::EmptyBuildCommand)?; + if build_command.is_empty() { + return Err(BuildInfoError::EmptyBuildCommand); + } + let build_command = + build_command.split_whitespace().map(|st| st.to_string()).collect::>(); + if build_command.is_empty() { + return Err(BuildInfoError::EmptyBuildCommand); + } + let contract_path = std::env::var("CARGO_NEAR_CONTRACT_PATH").ok(); + + if contract_path.as_ref().is_some_and(|path| path.is_empty()) { + return Err(BuildInfoError::EmptyContractPath); + } + let source_git_url = std::env::var("CARGO_NEAR_SOURCE_CODE_GIT_URL") + .map_err(|_| BuildInfoError::EmptySourceSnapshot)?; + if source_git_url.is_empty() { + return Err(BuildInfoError::EmptySourceSnapshot); + } + let source_commit = + std::env::var("CARGO_NEAR_SOURCE_CODE_COMMIT").unwrap_or("".to_string()); + + Ok(Self { build_environment, build_command, contract_path, source_git_url, source_commit }) + // env_field!(self.source_commit, "CARGO_NEAR_SOURCE_CODE_COMMIT"); + } +} diff --git a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs index 4efc62a60..67a89a385 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs @@ -2,6 +2,8 @@ use darling::{ast::NestedMeta, Error, FromMeta}; use proc_macro2::TokenStream; use quote::quote; +mod build_info; + #[derive(FromMeta)] struct MacroConfig { contract_metadata: Option, @@ -11,13 +13,12 @@ struct MacroConfig { pub(crate) struct ContractMetadata { version: Option, link: Option, - build_env: Option, - build_cmd: Option, - contract_path: Option, - source_commit: Option, - source_git_url: Option, + #[darling(multiple, rename = "standard")] standards: Vec, + + #[darling(skip)] + build_info: Option, } impl quote::ToTokens for ContractMetadata { @@ -53,30 +54,32 @@ struct Standard { impl ContractMetadata { fn populate(mut self) -> Self { macro_rules! env_field { - ($field: ident, $key: expr) => { - if self.$field.is_none() { + ($field: expr, $key: expr) => { + if $field.is_none() { let field_val = std::env::var($key).unwrap_or(String::from("")); if !field_val.is_empty() { - self.$field = Some(field_val); + $field = Some(field_val); } } }; } - env_field!(version, "CARGO_PKG_VERSION"); - env_field!(link, "CARGO_PKG_REPOSITORY"); - env_field!(build_env, "CARGO_NEAR_BUILD_ENVIRONMENT"); - env_field!(build_cmd, "CARGO_NEAR_BUILD_COMMAND"); - env_field!(contract_path, "CARGO_NEAR_CONTRACT_PATH"); - env_field!(source_commit, "CARGO_NEAR_SOURCE_CODE_COMMIT"); - env_field!(source_git_url, "CARGO_NEAR_SOURCE_CODE_GIT_URL"); + env_field!(self.version, "CARGO_PKG_VERSION"); + env_field!(self.link, "CARGO_PKG_REPOSITORY"); // adding nep330 if it is not present if self.standards.is_empty() || self.standards.iter().all(|s| s.standard.to_ascii_lowercase() != "nep330") { self.standards - .push(Standard { standard: "nep330".to_string(), version: "1.1.0".to_string() }); + .push(Standard { standard: "nep330".to_string(), version: "1.2.0".to_string() }); + } + + if std::env::var("CARGO_NEAR_BUILD_ENVIRONMENT").is_ok() { + self.build_info = Some( + build_info::BuildInfo::from_env() + .expect("Build Details Extension field not provided"), + ); } self From be7bbbd9507b0655f09f033d0af25af313110090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Fri, 3 May 2024 11:27:35 +0300 Subject: [PATCH 03/21] chore: better `std::fmt::Display` of errors of missing fields --- .../core_impl/contract_metadata/build_info.rs | 30 +++++++++++++++++++ .../src/core_impl/contract_metadata/mod.rs | 1 + 2 files changed, 31 insertions(+) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs index 90c330d47..a8ea47bfa 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs @@ -18,6 +18,36 @@ pub(super) enum BuildInfoError { EmptySourceSnapshot, } +impl std::fmt::Display for BuildInfoError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::EmptyBuildEnvironment => { + write!(f, "`CARGO_NEAR_BUILD_ENVIRONMENT` is set, but it's set to empty string!") + } + Self::EmptyBuildCommand => { + write!(f, "{}{}", + "`CARGO_NEAR_BUILD_COMMAND` is required, when `CARGO_NEAR_BUILD_ENVIRONMENT` is set,", + "but it's empty!" + ) + } + Self::EmptyContractPath => { + write!( + f, + "{}{}", + "`CARGO_NEAR_CONTRACT_PATH` was provided,", + "but it's empty! It's required to be non-empty, when present!" + ) + } + Self::EmptySourceSnapshot => { + write!(f, "{}{}", + "`CARGO_NEAR_SOURCE_CODE_GIT_URL` is required, when `CARGO_NEAR_BUILD_ENVIRONMENT` is set,", + "but it's empty!" + ) + } + } + } +} + impl BuildInfo { pub(super) fn from_env() -> Result { let build_environment = std::env::var("CARGO_NEAR_BUILD_ENVIRONMENT") diff --git a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs index 67a89a385..86671321b 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs @@ -78,6 +78,7 @@ impl ContractMetadata { if std::env::var("CARGO_NEAR_BUILD_ENVIRONMENT").is_ok() { self.build_info = Some( build_info::BuildInfo::from_env() + .map_err(|err| err.to_string()) .expect("Build Details Extension field not provided"), ); } From d0820ca38a3971cc5ddc1852239447cbf38d85d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Fri, 3 May 2024 15:34:28 +0300 Subject: [PATCH 04/21] chore: replace two `BuildInfo` fields with one from `CARGO_NEAR_SOURCE_CODE_SNAPSHOT` --- .../core_impl/contract_metadata/build_info.rs | 59 +++++++++++-------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs index a8ea47bfa..e62dd2660 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs @@ -3,9 +3,7 @@ pub(crate) struct BuildInfo { build_environment: String, build_command: Vec, contract_path: Option, - // pub source_code_snapshot: String, - source_commit: String, - source_git_url: String, + source_code_snapshot: String, } /// basic parsing errors @@ -50,35 +48,44 @@ impl std::fmt::Display for BuildInfoError { impl BuildInfo { pub(super) fn from_env() -> Result { - let build_environment = std::env::var("CARGO_NEAR_BUILD_ENVIRONMENT") - .map_err(|_| BuildInfoError::EmptyBuildEnvironment)?; - if build_environment.is_empty() { - return Err(BuildInfoError::EmptyBuildEnvironment); - } - let build_command = std::env::var("CARGO_NEAR_BUILD_COMMAND") - .map_err(|_| BuildInfoError::EmptyBuildCommand)?; - if build_command.is_empty() { - return Err(BuildInfoError::EmptyBuildCommand); - } - let build_command = - build_command.split_whitespace().map(|st| st.to_string()).collect::>(); - if build_command.is_empty() { - return Err(BuildInfoError::EmptyBuildCommand); + macro_rules! env_field { + ($field: ident, $env_key: expr, $error: expr) => { + let $field = std::env::var($env_key).map_err(|_| $error)?; + if $field.is_empty() { + return Err($error); + } + }; } + + env_field!( + build_environment, + "CARGO_NEAR_BUILD_ENVIRONMENT", + BuildInfoError::EmptyBuildEnvironment + ); + let build_command = { + env_field!( + build_command, + "CARGO_NEAR_BUILD_COMMAND", + BuildInfoError::EmptyBuildCommand + ); + let build_command = + build_command.split_whitespace().map(|st| st.to_string()).collect::>(); + if build_command.is_empty() { + return Err(BuildInfoError::EmptyBuildCommand); + } + build_command + }; + env_field!( + source_code_snapshot, + "CARGO_NEAR_SOURCE_CODE_SNAPSHOT", + BuildInfoError::EmptySourceSnapshot + ); let contract_path = std::env::var("CARGO_NEAR_CONTRACT_PATH").ok(); if contract_path.as_ref().is_some_and(|path| path.is_empty()) { return Err(BuildInfoError::EmptyContractPath); } - let source_git_url = std::env::var("CARGO_NEAR_SOURCE_CODE_GIT_URL") - .map_err(|_| BuildInfoError::EmptySourceSnapshot)?; - if source_git_url.is_empty() { - return Err(BuildInfoError::EmptySourceSnapshot); - } - let source_commit = - std::env::var("CARGO_NEAR_SOURCE_CODE_COMMIT").unwrap_or("".to_string()); - Ok(Self { build_environment, build_command, contract_path, source_git_url, source_commit }) - // env_field!(self.source_commit, "CARGO_NEAR_SOURCE_CODE_COMMIT"); + Ok(Self { build_environment, build_command, contract_path, source_code_snapshot }) } } From 71fdbb768acdbdded4f6ce0d0cd26d92dd712b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Fri, 3 May 2024 17:18:23 +0300 Subject: [PATCH 05/21] chore: add `CARGO_NEAR_REPO_LINK_HINT` as more precise alt to `CARGO_PKG_REPOSITORY` --- .../src/core_impl/contract_metadata/mod.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs index 86671321b..a865ce4df 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs @@ -54,9 +54,9 @@ struct Standard { impl ContractMetadata { fn populate(mut self) -> Self { macro_rules! env_field { - ($field: expr, $key: expr) => { + ($field: expr, $env_result: expr) => { if $field.is_none() { - let field_val = std::env::var($key).unwrap_or(String::from("")); + let field_val = $env_result.unwrap_or(String::from("")); if !field_val.is_empty() { $field = Some(field_val); } @@ -64,8 +64,11 @@ impl ContractMetadata { }; } - env_field!(self.version, "CARGO_PKG_VERSION"); - env_field!(self.link, "CARGO_PKG_REPOSITORY"); + env_field!( + self.link, + std::env::var("CARGO_NEAR_REPO_LINK_HINT").or(std::env::var("CARGO_PKG_REPOSITORY")) + ); + env_field!(self.version, std::env::var("CARGO_PKG_VERSION")); // adding nep330 if it is not present if self.standards.is_empty() From 22109b19a7702664b886da0df169690ed785f889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Tue, 7 May 2024 18:40:06 +0300 Subject: [PATCH 06/21] ci: fix new 1.78 lints ci: fix 1.78 lints --- examples/fungible-token/test-contract-defi/src/lib.rs | 1 + near-sdk-macros/src/core_impl/info_extractor/attr_sig_info.rs | 2 +- near-sdk/src/lib.rs | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/fungible-token/test-contract-defi/src/lib.rs b/examples/fungible-token/test-contract-defi/src/lib.rs index 8b6b7542c..83671a1e8 100644 --- a/examples/fungible-token/test-contract-defi/src/lib.rs +++ b/examples/fungible-token/test-contract-defi/src/lib.rs @@ -16,6 +16,7 @@ pub struct DeFi { } // Have to repeat the same trait for our own implementation. +#[allow(dead_code)] trait ValueReturnTrait { fn value_please(&self, amount_to_return: String) -> PromiseOrValue; } diff --git a/near-sdk-macros/src/core_impl/info_extractor/attr_sig_info.rs b/near-sdk-macros/src/core_impl/info_extractor/attr_sig_info.rs index 6eb010fa6..772565295 100644 --- a/near-sdk-macros/src/core_impl/info_extractor/attr_sig_info.rs +++ b/near-sdk-macros/src/core_impl/info_extractor/attr_sig_info.rs @@ -165,7 +165,7 @@ impl AttrSigInfo { self_occurrences.extend(args.iter().flat_map(|arg| arg.self_occurrences.clone())); - *original_attrs = non_bindgen_attrs.clone(); + original_attrs.clone_from(&non_bindgen_attrs); if matches!(method_kind, MethodKind::Call(_) | MethodKind::View(_)) { report_spans( diff --git a/near-sdk/src/lib.rs b/near-sdk/src/lib.rs index 8a219a258..45df0dbcd 100644 --- a/near-sdk/src/lib.rs +++ b/near-sdk/src/lib.rs @@ -3,6 +3,7 @@ #![allow(clippy::redundant_closure)] // We want to enable all clippy lints, but some of them generate false positives. #![allow(clippy::missing_const_for_fn, clippy::redundant_pub_crate)] +#![allow(clippy::multiple_bound_locations)] #[cfg(test)] extern crate quickcheck; From 64efdcf456f5da0afadc606b3bcb1faa96d70ed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Tue, 7 May 2024 19:16:19 +0300 Subject: [PATCH 07/21] test: `schemars` version update, `TRYBUILD=overwrite` --- near-sdk/compilation_tests/schema_derive_invalids.stderr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/near-sdk/compilation_tests/schema_derive_invalids.stderr b/near-sdk/compilation_tests/schema_derive_invalids.stderr index ceb7c3037..b26296b06 100644 --- a/near-sdk/compilation_tests/schema_derive_invalids.stderr +++ b/near-sdk/compilation_tests/schema_derive_invalids.stderr @@ -87,7 +87,7 @@ error[E0277]: the trait bound `Inner: JsonSchema` is not satisfied i128 and $N others note: required by a bound in `SchemaGenerator::subschema_for` - --> $CARGO/schemars-0.8.17/src/gen.rs + --> $CARGO/schemars-0.8.19/src/gen.rs | | pub fn subschema_for(&mut self) -> Schema { | ^^^^^^^^^^ required by this bound in `SchemaGenerator::subschema_for` From bf81221aeac1d3395c2a323367a7220993442ec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Wed, 8 May 2024 16:47:10 +0300 Subject: [PATCH 08/21] ci: fix pr specific clippy lints --- .../core_impl/contract_metadata/build_info.rs | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs index e62dd2660..26d7e7ada 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs @@ -8,27 +8,28 @@ pub(crate) struct BuildInfo { /// basic parsing errors #[derive(Debug)] -pub(super) enum BuildInfoError { - EmptyBuildEnvironment, - EmptyBuildCommand, +pub(super) enum FieldEmptyError { + BuildEnvironment, + BuildCommand, /// `None` value should be used instead for `contract_path` - EmptyContractPath, - EmptySourceSnapshot, + ContractPath, + SourceSnapshot, } -impl std::fmt::Display for BuildInfoError { +#[allow(clippy::write_literal)] +impl std::fmt::Display for FieldEmptyError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::EmptyBuildEnvironment => { + Self::BuildEnvironment => { write!(f, "`CARGO_NEAR_BUILD_ENVIRONMENT` is set, but it's set to empty string!") } - Self::EmptyBuildCommand => { + Self::BuildCommand => { write!(f, "{}{}", "`CARGO_NEAR_BUILD_COMMAND` is required, when `CARGO_NEAR_BUILD_ENVIRONMENT` is set,", "but it's empty!" ) } - Self::EmptyContractPath => { + Self::ContractPath => { write!( f, "{}{}", @@ -36,7 +37,7 @@ impl std::fmt::Display for BuildInfoError { "but it's empty! It's required to be non-empty, when present!" ) } - Self::EmptySourceSnapshot => { + Self::SourceSnapshot => { write!(f, "{}{}", "`CARGO_NEAR_SOURCE_CODE_GIT_URL` is required, when `CARGO_NEAR_BUILD_ENVIRONMENT` is set,", "but it's empty!" @@ -47,7 +48,7 @@ impl std::fmt::Display for BuildInfoError { } impl BuildInfo { - pub(super) fn from_env() -> Result { + pub(super) fn from_env() -> Result { macro_rules! env_field { ($field: ident, $env_key: expr, $error: expr) => { let $field = std::env::var($env_key).map_err(|_| $error)?; @@ -60,30 +61,26 @@ impl BuildInfo { env_field!( build_environment, "CARGO_NEAR_BUILD_ENVIRONMENT", - BuildInfoError::EmptyBuildEnvironment + FieldEmptyError::BuildEnvironment ); let build_command = { - env_field!( - build_command, - "CARGO_NEAR_BUILD_COMMAND", - BuildInfoError::EmptyBuildCommand - ); + env_field!(build_command, "CARGO_NEAR_BUILD_COMMAND", FieldEmptyError::BuildCommand); let build_command = build_command.split_whitespace().map(|st| st.to_string()).collect::>(); if build_command.is_empty() { - return Err(BuildInfoError::EmptyBuildCommand); + return Err(FieldEmptyError::BuildCommand); } build_command }; env_field!( source_code_snapshot, "CARGO_NEAR_SOURCE_CODE_SNAPSHOT", - BuildInfoError::EmptySourceSnapshot + FieldEmptyError::SourceSnapshot ); let contract_path = std::env::var("CARGO_NEAR_CONTRACT_PATH").ok(); if contract_path.as_ref().is_some_and(|path| path.is_empty()) { - return Err(BuildInfoError::EmptyContractPath); + return Err(FieldEmptyError::ContractPath); } Ok(Self { build_environment, build_command, contract_path, source_code_snapshot }) From b3bd35c2bedea97dd63e4f4dc4ac6b2c3f86f2eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Wed, 8 May 2024 21:31:18 +0300 Subject: [PATCH 09/21] chore: replace `Option` -> `String` of `BuildInfo.contract_path` --- .../core_impl/contract_metadata/build_info.rs | 58 +++++++++---------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs index 26d7e7ada..cd1545082 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs @@ -2,45 +2,40 @@ pub(crate) struct BuildInfo { build_environment: String, build_command: Vec, - contract_path: Option, + contract_path: String, source_code_snapshot: String, } /// basic parsing errors #[derive(Debug)] -pub(super) enum FieldEmptyError { - BuildEnvironment, - BuildCommand, +pub(super) enum FieldError { + EmptyBuildEnvironment, + UnsetOrEmptyBuildCommand, /// `None` value should be used instead for `contract_path` - ContractPath, - SourceSnapshot, + UnsetContractPath, + UnsetOrEmptySourceSnapshot, } #[allow(clippy::write_literal)] -impl std::fmt::Display for FieldEmptyError { +impl std::fmt::Display for FieldError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::BuildEnvironment => { + Self::EmptyBuildEnvironment => { write!(f, "`CARGO_NEAR_BUILD_ENVIRONMENT` is set, but it's set to empty string!") } - Self::BuildCommand => { + Self::UnsetOrEmptyBuildCommand => { write!(f, "{}{}", - "`CARGO_NEAR_BUILD_COMMAND` is required, when `CARGO_NEAR_BUILD_ENVIRONMENT` is set,", - "but it's empty!" + "`CARGO_NEAR_BUILD_COMMAND` is required, when `CARGO_NEAR_BUILD_ENVIRONMENT` is set, ", + "but it's either not set or empty!" ) } - Self::ContractPath => { - write!( - f, - "{}{}", - "`CARGO_NEAR_CONTRACT_PATH` was provided,", - "but it's empty! It's required to be non-empty, when present!" - ) + Self::UnsetContractPath => { + write!(f, "{}{}", "`CARGO_NEAR_CONTRACT_PATH` was provided, ", "but it's not set!") } - Self::SourceSnapshot => { + Self::UnsetOrEmptySourceSnapshot => { write!(f, "{}{}", - "`CARGO_NEAR_SOURCE_CODE_GIT_URL` is required, when `CARGO_NEAR_BUILD_ENVIRONMENT` is set,", - "but it's empty!" + "`CARGO_NEAR_SOURCE_CODE_GIT_URL` is required, when `CARGO_NEAR_BUILD_ENVIRONMENT` is set, ", + "but it's either not set or empty!" ) } } @@ -48,7 +43,7 @@ impl std::fmt::Display for FieldEmptyError { } impl BuildInfo { - pub(super) fn from_env() -> Result { + pub(super) fn from_env() -> Result { macro_rules! env_field { ($field: ident, $env_key: expr, $error: expr) => { let $field = std::env::var($env_key).map_err(|_| $error)?; @@ -61,27 +56,28 @@ impl BuildInfo { env_field!( build_environment, "CARGO_NEAR_BUILD_ENVIRONMENT", - FieldEmptyError::BuildEnvironment + FieldError::EmptyBuildEnvironment ); let build_command = { - env_field!(build_command, "CARGO_NEAR_BUILD_COMMAND", FieldEmptyError::BuildCommand); + env_field!( + build_command, + "CARGO_NEAR_BUILD_COMMAND", + FieldError::UnsetOrEmptyBuildCommand + ); let build_command = build_command.split_whitespace().map(|st| st.to_string()).collect::>(); if build_command.is_empty() { - return Err(FieldEmptyError::BuildCommand); + return Err(FieldError::UnsetOrEmptyBuildCommand); } build_command }; env_field!( source_code_snapshot, "CARGO_NEAR_SOURCE_CODE_SNAPSHOT", - FieldEmptyError::SourceSnapshot + FieldError::UnsetOrEmptySourceSnapshot ); - let contract_path = std::env::var("CARGO_NEAR_CONTRACT_PATH").ok(); - - if contract_path.as_ref().is_some_and(|path| path.is_empty()) { - return Err(FieldEmptyError::ContractPath); - } + let contract_path = + std::env::var("CARGO_NEAR_CONTRACT_PATH").map_err(|_| FieldError::UnsetContractPath)?; Ok(Self { build_environment, build_command, contract_path, source_code_snapshot }) } From d4a44dddd9c894b40d672255861667e5b0b9b93e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Thu, 6 Jun 2024 22:35:44 +0300 Subject: [PATCH 10/21] chore: bump MSRV to 1.73.0 --- .github/workflows/test.yml | 5 +++-- README.md | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ea0e1db5b..f1a39a515 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: platform: [ubuntu-latest, macos-latest] - toolchain: [stable, 1.72.1] + toolchain: [stable, 1.73.0] steps: - uses: actions/checkout@v3 - name: "${{ matrix.toolchain }} with rustfmt, and wasm32" @@ -26,7 +26,8 @@ jobs: - uses: Swatinem/rust-cache@v1 - name: Downgrade dependencies run: | - cargo update -p clap@4.5.4 --precise 4.4.18 + cargo update -p clap --precise 4.4.18 + cargo update -p symbolic-debuginfo --precise 12.8.0 cd examples/adder && cargo update -p clap@4.5.4 --precise 4.4.18 - name: test run: cargo test --all --features unstable,legacy diff --git a/README.md b/README.md index 9796a458d..3e7a645b8 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Crates.io version Download Reference Documentation - MSRV + MSRV Join the community on Discord GitHub Actions Build

@@ -321,7 +321,7 @@ State breaking changes (low-level serialization format of any data type) will be ### MSRV -The minimum supported Rust version is currently `1.72`. There are no guarantees that this will be upheld if a security patch release needs to come in that requires a Rust toolchain increase. +The minimum supported Rust version is currently `1.73`. There are no guarantees that this will be upheld if a security patch release needs to come in that requires a Rust toolchain increase. ## Contributing From cd6c5fc92b4611fabb17e77ffa3d6f2d9f31db3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Thu, 6 Jun 2024 22:35:44 +0300 Subject: [PATCH 11/21] chore: bump MSRV to 1.73.0 --- .github/workflows/test.yml | 7 ++++--- README.md | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ea0e1db5b..a0e16d973 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: platform: [ubuntu-latest, macos-latest] - toolchain: [stable, 1.72.1] + toolchain: [stable, 1.73.0] steps: - uses: actions/checkout@v3 - name: "${{ matrix.toolchain }} with rustfmt, and wasm32" @@ -26,8 +26,9 @@ jobs: - uses: Swatinem/rust-cache@v1 - name: Downgrade dependencies run: | - cargo update -p clap@4.5.4 --precise 4.4.18 - cd examples/adder && cargo update -p clap@4.5.4 --precise 4.4.18 + cargo update -p clap --precise 4.4.18 + cargo update -p symbolic-debuginfo --precise 12.8.0 + cd examples/adder && cargo update -p clap --precise 4.4.18 - name: test run: cargo test --all --features unstable,legacy lint: diff --git a/README.md b/README.md index 9796a458d..3e7a645b8 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Crates.io version Download Reference Documentation - MSRV + MSRV Join the community on Discord GitHub Actions Build

@@ -321,7 +321,7 @@ State breaking changes (low-level serialization format of any data type) will be ### MSRV -The minimum supported Rust version is currently `1.72`. There are no guarantees that this will be upheld if a security patch release needs to come in that requires a Rust toolchain increase. +The minimum supported Rust version is currently `1.73`. There are no guarantees that this will be upheld if a security patch release needs to come in that requires a Rust toolchain increase. ## Contributing From cb1d28b924bc503d40158be546fbd29d0c302fa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Thu, 6 Jun 2024 22:35:44 +0300 Subject: [PATCH 12/21] chore: bump MSRV to 1.73.0 --- .github/workflows/test.yml | 7 ++++--- README.md | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ea0e1db5b..bb1d4b9ca 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: platform: [ubuntu-latest, macos-latest] - toolchain: [stable, 1.72.1] + toolchain: [stable, 1.73.0] steps: - uses: actions/checkout@v3 - name: "${{ matrix.toolchain }} with rustfmt, and wasm32" @@ -26,8 +26,9 @@ jobs: - uses: Swatinem/rust-cache@v1 - name: Downgrade dependencies run: | - cargo update -p clap@4.5.4 --precise 4.4.18 - cd examples/adder && cargo update -p clap@4.5.4 --precise 4.4.18 + cargo update -p clap@4.5.5 --precise 4.4.18 + cargo update -p symbolic-debuginfo --precise 12.8.0 + cd examples/adder && cargo update -p clap@4.5.5 --precise 4.4.18 - name: test run: cargo test --all --features unstable,legacy lint: diff --git a/README.md b/README.md index 9796a458d..3e7a645b8 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Crates.io version Download Reference Documentation - MSRV + MSRV Join the community on Discord GitHub Actions Build

@@ -321,7 +321,7 @@ State breaking changes (low-level serialization format of any data type) will be ### MSRV -The minimum supported Rust version is currently `1.72`. There are no guarantees that this will be upheld if a security patch release needs to come in that requires a Rust toolchain increase. +The minimum supported Rust version is currently `1.73`. There are no guarantees that this will be upheld if a security patch release needs to come in that requires a Rust toolchain increase. ## Contributing From b2823cbcfbe7a5e86ff5dadc9b05e6d3fa11d506 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Thu, 6 Jun 2024 23:00:28 +0300 Subject: [PATCH 13/21] review: address https://github.com/near/near-sdk-rs/pull/1178#discussion_r1628158492 --- .../core_impl/contract_metadata/build_info.rs | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs index cd1545082..359c2210d 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs @@ -44,26 +44,18 @@ impl std::fmt::Display for FieldError { impl BuildInfo { pub(super) fn from_env() -> Result { - macro_rules! env_field { - ($field: ident, $env_key: expr, $error: expr) => { - let $field = std::env::var($env_key).map_err(|_| $error)?; - if $field.is_empty() { - return Err($error); - } - }; + let build_environment = std::env::var("CARGO_NEAR_BUILD_ENVIRONMENT") + .map_err(|_| FieldError::EmptyBuildEnvironment)?; + if build_environment.is_empty() { + return Err(FieldError::EmptyBuildEnvironment); } - env_field!( - build_environment, - "CARGO_NEAR_BUILD_ENVIRONMENT", - FieldError::EmptyBuildEnvironment - ); let build_command = { - env_field!( - build_command, - "CARGO_NEAR_BUILD_COMMAND", - FieldError::UnsetOrEmptyBuildCommand - ); + let build_command = std::env::var("CARGO_NEAR_BUILD_COMMAND") + .map_err(|_| FieldError::UnsetOrEmptyBuildCommand)?; + if build_command.is_empty() { + return Err(FieldError::UnsetOrEmptyBuildCommand); + } let build_command = build_command.split_whitespace().map(|st| st.to_string()).collect::>(); if build_command.is_empty() { @@ -71,11 +63,11 @@ impl BuildInfo { } build_command }; - env_field!( - source_code_snapshot, - "CARGO_NEAR_SOURCE_CODE_SNAPSHOT", - FieldError::UnsetOrEmptySourceSnapshot - ); + let source_code_snapshot = std::env::var("CARGO_NEAR_SOURCE_CODE_SNAPSHOT") + .map_err(|_| FieldError::UnsetOrEmptySourceSnapshot)?; + if source_code_snapshot.is_empty() { + return Err(FieldError::UnsetOrEmptySourceSnapshot); + } let contract_path = std::env::var("CARGO_NEAR_CONTRACT_PATH").map_err(|_| FieldError::UnsetContractPath)?; From 3b56d6e76744d4bdf2def35ff80edf425e2fe36f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Thu, 6 Jun 2024 23:16:16 +0300 Subject: [PATCH 14/21] review: address https://github.com/near/near-sdk-rs/pull/1178#discussion_r1628161120 --- .../src/core_impl/contract_metadata/mod.rs | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs index a865ce4df..98f0fb974 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs @@ -53,22 +53,20 @@ struct Standard { impl ContractMetadata { fn populate(mut self) -> Self { - macro_rules! env_field { - ($field: expr, $env_result: expr) => { - if $field.is_none() { - let field_val = $env_result.unwrap_or(String::from("")); - if !field_val.is_empty() { - $field = Some(field_val); - } - } - }; + if self.link.is_none() { + let field_val = std::env::var("CARGO_NEAR_REPO_LINK_HINT") + .or(std::env::var("CARGO_PKG_REPOSITORY")) + .unwrap_or(String::from("")); + if !field_val.is_empty() { + self.link = Some(field_val); + } + } + if self.version.is_none() { + let field_val = std::env::var("CARGO_PKG_VERSION").unwrap_or(String::from("")); + if !field_val.is_empty() { + self.version = Some(field_val); + } } - - env_field!( - self.link, - std::env::var("CARGO_NEAR_REPO_LINK_HINT").or(std::env::var("CARGO_PKG_REPOSITORY")) - ); - env_field!(self.version, std::env::var("CARGO_PKG_VERSION")); // adding nep330 if it is not present if self.standards.is_empty() From 9ff44ca7cabbf145d531f899f2db71b98128db99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Fri, 7 Jun 2024 00:07:23 +0300 Subject: [PATCH 15/21] review: addresses https://github.com/near/near-sdk-rs/pull/1178#discussion_r1628149583 --- .../core_impl/contract_metadata/build_info.rs | 65 ++++++------------- .../src/core_impl/contract_metadata/mod.rs | 1 - 2 files changed, 21 insertions(+), 45 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs index 359c2210d..359c1fa21 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs @@ -6,70 +6,47 @@ pub(crate) struct BuildInfo { source_code_snapshot: String, } -/// basic parsing errors -#[derive(Debug)] -pub(super) enum FieldError { - EmptyBuildEnvironment, - UnsetOrEmptyBuildCommand, - /// `None` value should be used instead for `contract_path` - UnsetContractPath, - UnsetOrEmptySourceSnapshot, -} +const ERR_EMPTY_BUILD_ENVIRONMENT: &str = "`CARGO_NEAR_BUILD_ENVIRONMENT` is set, \ + but it's set to empty string!"; +const ERR_EMPTY_BUILD_COMMAND: &str = "`CARGO_NEAR_BUILD_COMMAND` is required, \ + when `CARGO_NEAR_BUILD_ENVIRONMENT` is set, \ + but it's either not set or empty!"; -#[allow(clippy::write_literal)] -impl std::fmt::Display for FieldError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::EmptyBuildEnvironment => { - write!(f, "`CARGO_NEAR_BUILD_ENVIRONMENT` is set, but it's set to empty string!") - } - Self::UnsetOrEmptyBuildCommand => { - write!(f, "{}{}", - "`CARGO_NEAR_BUILD_COMMAND` is required, when `CARGO_NEAR_BUILD_ENVIRONMENT` is set, ", - "but it's either not set or empty!" - ) - } - Self::UnsetContractPath => { - write!(f, "{}{}", "`CARGO_NEAR_CONTRACT_PATH` was provided, ", "but it's not set!") - } - Self::UnsetOrEmptySourceSnapshot => { - write!(f, "{}{}", - "`CARGO_NEAR_SOURCE_CODE_GIT_URL` is required, when `CARGO_NEAR_BUILD_ENVIRONMENT` is set, ", - "but it's either not set or empty!" - ) - } - } - } -} +const ERR_UNSET_CONTRACT_PATH: &str = "`CARGO_NEAR_CONTRACT_PATH` was provided, \ + but it's not set!"; + +const ERR_UNSET_OR_EMPTY_SOURCE_SNAPSHOT: &str = "`CARGO_NEAR_SOURCE_CODE_GIT_URL` is \ + required, when `CARGO_NEAR_BUILD_ENVIRONMENT` \ + is set, but it's either not set or empty!"; impl BuildInfo { - pub(super) fn from_env() -> Result { + pub(super) fn from_env() -> Result { let build_environment = std::env::var("CARGO_NEAR_BUILD_ENVIRONMENT") - .map_err(|_| FieldError::EmptyBuildEnvironment)?; + .map_err(|_| ERR_EMPTY_BUILD_ENVIRONMENT.to_string())?; if build_environment.is_empty() { - return Err(FieldError::EmptyBuildEnvironment); + return Err(ERR_EMPTY_BUILD_ENVIRONMENT.to_string()); } let build_command = { let build_command = std::env::var("CARGO_NEAR_BUILD_COMMAND") - .map_err(|_| FieldError::UnsetOrEmptyBuildCommand)?; + .map_err(|_| ERR_EMPTY_BUILD_COMMAND.to_string())?; if build_command.is_empty() { - return Err(FieldError::UnsetOrEmptyBuildCommand); + return Err(ERR_EMPTY_BUILD_COMMAND.to_string()); } let build_command = build_command.split_whitespace().map(|st| st.to_string()).collect::>(); if build_command.is_empty() { - return Err(FieldError::UnsetOrEmptyBuildCommand); + return Err(ERR_EMPTY_BUILD_COMMAND.to_string()); } build_command }; let source_code_snapshot = std::env::var("CARGO_NEAR_SOURCE_CODE_SNAPSHOT") - .map_err(|_| FieldError::UnsetOrEmptySourceSnapshot)?; + .map_err(|_| ERR_UNSET_OR_EMPTY_SOURCE_SNAPSHOT.to_string())?; if source_code_snapshot.is_empty() { - return Err(FieldError::UnsetOrEmptySourceSnapshot); + return Err(ERR_UNSET_OR_EMPTY_SOURCE_SNAPSHOT.to_string()); } - let contract_path = - std::env::var("CARGO_NEAR_CONTRACT_PATH").map_err(|_| FieldError::UnsetContractPath)?; + let contract_path = std::env::var("CARGO_NEAR_CONTRACT_PATH") + .map_err(|_| ERR_UNSET_CONTRACT_PATH.to_string())?; Ok(Self { build_environment, build_command, contract_path, source_code_snapshot }) } diff --git a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs index 98f0fb974..226c4d5e6 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs @@ -79,7 +79,6 @@ impl ContractMetadata { if std::env::var("CARGO_NEAR_BUILD_ENVIRONMENT").is_ok() { self.build_info = Some( build_info::BuildInfo::from_env() - .map_err(|err| err.to_string()) .expect("Build Details Extension field not provided"), ); } From ce5c116f9362eba6b9a3e3394c98261faaf94cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Mon, 10 Jun 2024 16:32:33 +0300 Subject: [PATCH 16/21] review: addresses https://github.com/near/near-sdk-rs/pull/1178#discussion_r1628149583, part 2 --- .../core_impl/contract_metadata/build_info.rs | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs index 359c1fa21..ba12e9e8f 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs @@ -22,29 +22,22 @@ const ERR_UNSET_OR_EMPTY_SOURCE_SNAPSHOT: &str = "`CARGO_NEAR_SOURCE_CODE_GIT_UR impl BuildInfo { pub(super) fn from_env() -> Result { let build_environment = std::env::var("CARGO_NEAR_BUILD_ENVIRONMENT") - .map_err(|_| ERR_EMPTY_BUILD_ENVIRONMENT.to_string())?; - if build_environment.is_empty() { - return Err(ERR_EMPTY_BUILD_ENVIRONMENT.to_string()); - } + .ok() + .filter(|build_environment| !build_environment.is_empty()) + .ok_or(ERR_EMPTY_BUILD_ENVIRONMENT.to_string())?; - let build_command = { - let build_command = std::env::var("CARGO_NEAR_BUILD_COMMAND") - .map_err(|_| ERR_EMPTY_BUILD_COMMAND.to_string())?; - if build_command.is_empty() { - return Err(ERR_EMPTY_BUILD_COMMAND.to_string()); - } - let build_command = - build_command.split_whitespace().map(|st| st.to_string()).collect::>(); - if build_command.is_empty() { - return Err(ERR_EMPTY_BUILD_COMMAND.to_string()); - } - build_command - }; + let build_command = std::env::var("CARGO_NEAR_BUILD_COMMAND") + .ok() + .filter(|build_command| !build_command.is_empty()) + .map(|build_command| { + build_command.split_whitespace().map(|st| st.to_string()).collect::>() + }) + .filter(|build_command| !build_command.is_empty()) + .ok_or(ERR_EMPTY_BUILD_COMMAND.to_string())?; let source_code_snapshot = std::env::var("CARGO_NEAR_SOURCE_CODE_SNAPSHOT") - .map_err(|_| ERR_UNSET_OR_EMPTY_SOURCE_SNAPSHOT.to_string())?; - if source_code_snapshot.is_empty() { - return Err(ERR_UNSET_OR_EMPTY_SOURCE_SNAPSHOT.to_string()); - } + .ok() + .filter(|source_code_snapshot| !source_code_snapshot.is_empty()) + .ok_or(ERR_UNSET_OR_EMPTY_SOURCE_SNAPSHOT.to_string())?; let contract_path = std::env::var("CARGO_NEAR_CONTRACT_PATH") .map_err(|_| ERR_UNSET_CONTRACT_PATH.to_string())?; From 223917ba564aac3e3fb8a554397ed1cd2d5dd613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Mon, 10 Jun 2024 22:52:45 +0300 Subject: [PATCH 17/21] review: addresses https://github.com/near/near-sdk-rs/pull/1178#discussion_r1628196147, part 1 --- .../core_impl/contract_metadata/build_info.rs | 20 +++++++++---------- .../src/core_impl/contract_metadata/mod.rs | 8 +++++--- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs index ba12e9e8f..b7752fe5e 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs @@ -6,27 +6,27 @@ pub(crate) struct BuildInfo { source_code_snapshot: String, } -const ERR_EMPTY_BUILD_ENVIRONMENT: &str = "`CARGO_NEAR_BUILD_ENVIRONMENT` is set, \ +const ERR_EMPTY_BUILD_ENVIRONMENT: &str = "`NEP330_BUILD_INFO_BUILD_ENVIRONMENT` is set, \ but it's set to empty string!"; -const ERR_EMPTY_BUILD_COMMAND: &str = "`CARGO_NEAR_BUILD_COMMAND` is required, \ - when `CARGO_NEAR_BUILD_ENVIRONMENT` is set, \ +const ERR_EMPTY_BUILD_COMMAND: &str = "`NEP330_BUILD_INFO_BUILD_COMMAND` is required, \ + when `NEP330_BUILD_INFO_BUILD_ENVIRONMENT` is set, \ but it's either not set or empty!"; -const ERR_UNSET_CONTRACT_PATH: &str = "`CARGO_NEAR_CONTRACT_PATH` was provided, \ +const ERR_UNSET_CONTRACT_PATH: &str = "`NEP330_BUILD_INFO_CONTRACT_PATH` was provided, \ but it's not set!"; -const ERR_UNSET_OR_EMPTY_SOURCE_SNAPSHOT: &str = "`CARGO_NEAR_SOURCE_CODE_GIT_URL` is \ - required, when `CARGO_NEAR_BUILD_ENVIRONMENT` \ +const ERR_UNSET_OR_EMPTY_SOURCE_SNAPSHOT: &str = "`NEP330_BUILD_INFO_SOURCE_CODE_SNAPSHOT` is \ + required, when `NEP330_BUILD_INFO_BUILD_ENVIRONMENT` \ is set, but it's either not set or empty!"; impl BuildInfo { pub(super) fn from_env() -> Result { - let build_environment = std::env::var("CARGO_NEAR_BUILD_ENVIRONMENT") + let build_environment = std::env::var("NEP330_BUILD_INFO_BUILD_ENVIRONMENT") .ok() .filter(|build_environment| !build_environment.is_empty()) .ok_or(ERR_EMPTY_BUILD_ENVIRONMENT.to_string())?; - let build_command = std::env::var("CARGO_NEAR_BUILD_COMMAND") + let build_command = std::env::var("NEP330_BUILD_INFO_BUILD_COMMAND") .ok() .filter(|build_command| !build_command.is_empty()) .map(|build_command| { @@ -34,11 +34,11 @@ impl BuildInfo { }) .filter(|build_command| !build_command.is_empty()) .ok_or(ERR_EMPTY_BUILD_COMMAND.to_string())?; - let source_code_snapshot = std::env::var("CARGO_NEAR_SOURCE_CODE_SNAPSHOT") + let source_code_snapshot = std::env::var("NEP330_BUILD_INFO_SOURCE_CODE_SNAPSHOT") .ok() .filter(|source_code_snapshot| !source_code_snapshot.is_empty()) .ok_or(ERR_UNSET_OR_EMPTY_SOURCE_SNAPSHOT.to_string())?; - let contract_path = std::env::var("CARGO_NEAR_CONTRACT_PATH") + let contract_path = std::env::var("NEP330_BUILD_INFO_CONTRACT_PATH") .map_err(|_| ERR_UNSET_CONTRACT_PATH.to_string())?; Ok(Self { build_environment, build_command, contract_path, source_code_snapshot }) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs index 226c4d5e6..c5340aa9d 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs @@ -54,7 +54,7 @@ struct Standard { impl ContractMetadata { fn populate(mut self) -> Self { if self.link.is_none() { - let field_val = std::env::var("CARGO_NEAR_REPO_LINK_HINT") + let field_val = std::env::var("NEP330_LINK") .or(std::env::var("CARGO_PKG_REPOSITORY")) .unwrap_or(String::from("")); if !field_val.is_empty() { @@ -62,7 +62,9 @@ impl ContractMetadata { } } if self.version.is_none() { - let field_val = std::env::var("CARGO_PKG_VERSION").unwrap_or(String::from("")); + let field_val = std::env::var("NEP330_VERSION") + .or(std::env::var("CARGO_PKG_VERSION")) + .unwrap_or(String::from("")); if !field_val.is_empty() { self.version = Some(field_val); } @@ -76,7 +78,7 @@ impl ContractMetadata { .push(Standard { standard: "nep330".to_string(), version: "1.2.0".to_string() }); } - if std::env::var("CARGO_NEAR_BUILD_ENVIRONMENT").is_ok() { + if std::env::var("NEP330_BUILD_INFO_BUILD_ENVIRONMENT").is_ok() { self.build_info = Some( build_info::BuildInfo::from_env() .expect("Build Details Extension field not provided"), From 74e4848885fcc3c421781e5faa516901e4aa000b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Wed, 12 Jun 2024 22:35:05 +0300 Subject: [PATCH 18/21] review: addresses https://github.com/near/near-sdk-rs/pull/1178#discussion_r1628196147, part 2 --- near-sdk-macros/src/core_impl/contract_metadata/mod.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs index c5340aa9d..f17bd3172 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs @@ -62,9 +62,7 @@ impl ContractMetadata { } } if self.version.is_none() { - let field_val = std::env::var("NEP330_VERSION") - .or(std::env::var("CARGO_PKG_VERSION")) - .unwrap_or(String::from("")); + let field_val = std::env::var("NEP330_VERSION").unwrap_or(String::from("")); if !field_val.is_empty() { self.version = Some(field_val); } From 8d0c65f9a908434b8c256c5e5ba50e5c64b77ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Thu, 13 Jun 2024 15:24:33 +0300 Subject: [PATCH 19/21] review: addresses https://github.com/near/near-sdk-rs/pull/1178#discussion_r1628196147, part 3 --- near-sdk-macros/src/core_impl/contract_metadata/mod.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs index f17bd3172..35588796d 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs @@ -54,9 +54,7 @@ struct Standard { impl ContractMetadata { fn populate(mut self) -> Self { if self.link.is_none() { - let field_val = std::env::var("NEP330_LINK") - .or(std::env::var("CARGO_PKG_REPOSITORY")) - .unwrap_or(String::from("")); + let field_val = std::env::var("NEP330_LINK").unwrap_or(String::from("")); if !field_val.is_empty() { self.link = Some(field_val); } From fb84219c0555b9c7be237848b08ea2656f345099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Thu, 13 Jun 2024 21:19:45 +0300 Subject: [PATCH 20/21] review: addresses https://github.com/near/near-sdk-rs/pull/1178#discussion_r1628156517 --- .../src/core_impl/contract_metadata/build_info.rs | 8 ++++---- near-sdk-macros/src/core_impl/contract_metadata/mod.rs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs index b7752fe5e..33f0b2176 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/build_info.rs @@ -11,6 +11,7 @@ const ERR_EMPTY_BUILD_ENVIRONMENT: &str = "`NEP330_BUILD_INFO_BUILD_ENVIRONMENT` const ERR_EMPTY_BUILD_COMMAND: &str = "`NEP330_BUILD_INFO_BUILD_COMMAND` is required, \ when `NEP330_BUILD_INFO_BUILD_ENVIRONMENT` is set, \ but it's either not set or empty!"; +const ERR_PARSE_BUILD_COMMAND: &str = "problem parsing `NEP330_BUILD_INFO_BUILD_COMMAND` value"; const ERR_UNSET_CONTRACT_PATH: &str = "`NEP330_BUILD_INFO_CONTRACT_PATH` was provided, \ but it's not set!"; @@ -29,11 +30,10 @@ impl BuildInfo { let build_command = std::env::var("NEP330_BUILD_INFO_BUILD_COMMAND") .ok() .filter(|build_command| !build_command.is_empty()) - .map(|build_command| { - build_command.split_whitespace().map(|st| st.to_string()).collect::>() - }) - .filter(|build_command| !build_command.is_empty()) .ok_or(ERR_EMPTY_BUILD_COMMAND.to_string())?; + let build_command: Vec = serde_json::from_str(&build_command) + .map_err(|err| format!("{}: {}", ERR_PARSE_BUILD_COMMAND, err))?; + let source_code_snapshot = std::env::var("NEP330_BUILD_INFO_SOURCE_CODE_SNAPSHOT") .ok() .filter(|source_code_snapshot| !source_code_snapshot.is_empty()) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs index 35588796d..3b9694179 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs @@ -77,7 +77,7 @@ impl ContractMetadata { if std::env::var("NEP330_BUILD_INFO_BUILD_ENVIRONMENT").is_ok() { self.build_info = Some( build_info::BuildInfo::from_env() - .expect("Build Details Extension field not provided"), + .expect("Build Details Extension field not provided or malformed"), ); } From 39baf199d79a675ff6c78e1d1e2c2c56896e18ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dj8yf0=CE=BCl?= Date: Wed, 19 Jun 2024 12:51:34 +0300 Subject: [PATCH 21/21] clippy: silence `manual_unwrap_or_default` lint detection bug --- near-sdk-macros/src/core_impl/contract_metadata/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs index 3b9694179..b2d51588e 100644 --- a/near-sdk-macros/src/core_impl/contract_metadata/mod.rs +++ b/near-sdk-macros/src/core_impl/contract_metadata/mod.rs @@ -1,3 +1,5 @@ +#![allow(clippy::manual_unwrap_or_default)] + use darling::{ast::NestedMeta, Error, FromMeta}; use proc_macro2::TokenStream; use quote::quote;