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 @@
-
+
@@ -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 @@
-
+
@@ -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 @@
-
+
@@ -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;