Page MenuHomePhabricator

D8850.id30019.diff
No OneTemporary

D8850.id30019.diff

diff --git a/services/blob/src/database/client.rs b/services/blob/src/database/client.rs
--- a/services/blob/src/database/client.rs
+++ b/services/blob/src/database/client.rs
@@ -4,7 +4,7 @@
Error as DynamoDBError,
};
use chrono::Utc;
-use comm_services_lib::database::parse_string_attribute;
+use comm_services_lib::database::TryFromAttribute;
use std::{collections::HashMap, sync::Arc};
use tracing::{debug, error, trace};
@@ -205,7 +205,7 @@
// filter out rows that are blob items
// we cannot do it in key condition expression - it doesn't support the <> operator
// filter expression doesn't work either - it doesn't support filtering by sort key
- match parse_string_attribute(ATTR_HOLDER, row.remove(ATTR_HOLDER)) {
+ match String::try_from_attr(ATTR_HOLDER, row.remove(ATTR_HOLDER)) {
Ok(value) if value.as_str() == BLOB_ITEM_ROW_HOLDER_VALUE => None,
holder => Some(holder),
}
diff --git a/services/blob/src/database/old.rs b/services/blob/src/database/old.rs
--- a/services/blob/src/database/old.rs
+++ b/services/blob/src/database/old.rs
@@ -1,3 +1,5 @@
+#![allow(deprecated)]
+
use aws_sdk_dynamodb::{
operation::get_item::GetItemOutput, types::AttributeValue,
};
diff --git a/services/blob/src/database/types.rs b/services/blob/src/database/types.rs
--- a/services/blob/src/database/types.rs
+++ b/services/blob/src/database/types.rs
@@ -1,7 +1,7 @@
use aws_sdk_dynamodb::types::AttributeValue;
use chrono::{DateTime, Utc};
use comm_services_lib::database::{
- parse_string_attribute, parse_timestamp_attribute, DBItemError, Value,
+ parse_timestamp_attribute, AttributeTryInto, DBItemError, Value,
};
use derive_more::Constructor;
use std::collections::HashMap;
@@ -29,10 +29,10 @@
type Error = DBError;
fn try_from(attributes: RawAttributes) -> Result<Self, Self::Error> {
- let holder = parse_string_attribute(
- ATTR_HOLDER,
- attributes.get(ATTR_HOLDER).cloned(),
- )?;
+ let holder: String = attributes
+ .get(ATTR_HOLDER)
+ .cloned()
+ .attr_try_into(ATTR_HOLDER)?;
let row = match holder.as_str() {
BLOB_ITEM_ROW_HOLDER_VALUE => DBRow::BlobItem(attributes.try_into()?),
_ => DBRow::HolderAssignment(attributes.try_into()?),
@@ -79,12 +79,12 @@
type Error = DBError;
fn try_from(mut attributes: RawAttributes) -> Result<Self, Self::Error> {
- let blob_hash = parse_string_attribute(
- ATTR_BLOB_HASH,
- attributes.remove(ATTR_BLOB_HASH),
- )?;
- let s3_path =
- parse_string_attribute(ATTR_S3_PATH, attributes.remove(ATTR_S3_PATH))?;
+ let blob_hash = attributes
+ .remove(ATTR_BLOB_HASH)
+ .attr_try_into(ATTR_BLOB_HASH)?;
+ let s3_path: String = attributes
+ .remove(ATTR_S3_PATH)
+ .attr_try_into(ATTR_S3_PATH)?;
let created_at = parse_timestamp_attribute(
ATTR_CREATED_AT,
attributes.remove(ATTR_CREATED_AT),
@@ -123,12 +123,10 @@
type Error = DBError;
fn try_from(mut attributes: RawAttributes) -> Result<Self, Self::Error> {
- let holder =
- parse_string_attribute(ATTR_HOLDER, attributes.remove(ATTR_HOLDER))?;
- let blob_hash = parse_string_attribute(
- ATTR_BLOB_HASH,
- attributes.remove(ATTR_BLOB_HASH),
- )?;
+ let holder = attributes.remove(ATTR_HOLDER).attr_try_into(ATTR_HOLDER)?;
+ let blob_hash = attributes
+ .remove(ATTR_BLOB_HASH)
+ .attr_try_into(ATTR_BLOB_HASH)?;
let created_at = parse_timestamp_attribute(
ATTR_CREATED_AT,
attributes.remove(ATTR_CREATED_AT),
@@ -174,12 +172,10 @@
type Error = DBError;
fn try_from(mut attributes: RawAttributes) -> Result<Self, Self::Error> {
- let blob_hash = parse_string_attribute(
- ATTR_BLOB_HASH,
- attributes.remove(ATTR_BLOB_HASH),
- )?;
- let holder =
- parse_string_attribute(ATTR_HOLDER, attributes.remove(ATTR_HOLDER))?;
+ let blob_hash = attributes
+ .remove(ATTR_BLOB_HASH)
+ .attr_try_into(ATTR_BLOB_HASH)?;
+ let holder = attributes.remove(ATTR_HOLDER).attr_try_into(ATTR_HOLDER)?;
Ok(PrimaryKey { blob_hash, holder })
}
}
diff --git a/services/blob/src/service.rs b/services/blob/src/service.rs
--- a/services/blob/src/service.rs
+++ b/services/blob/src/service.rs
@@ -211,7 +211,7 @@
trace!("Getting blob item");
let Some(blob_item) = self.db.get_blob_item(&blob_hash).await? else {
trace!("Blob item not found, nothing to do");
- return Ok(())
+ return Ok(());
};
trace!("Deleting S3 object");
diff --git a/services/comm-services-lib/src/database.rs b/services/comm-services-lib/src/database.rs
--- a/services/comm-services-lib/src/database.rs
+++ b/services/comm-services-lib/src/database.rs
@@ -1,11 +1,27 @@
use aws_sdk_dynamodb::types::AttributeValue;
use aws_sdk_dynamodb::Error as DynamoDBError;
use chrono::{DateTime, Utc};
-use std::collections::HashMap;
use std::fmt::{Display, Formatter};
use std::num::ParseIntError;
use std::str::FromStr;
+// # Useful type aliases
+
+// Rust exports `pub type` only into the so-called "type namespace", but in
+// order to use them e.g. with the `TryFromAttribute` trait, they also need
+// to be exported into the "value namespace" which is what `pub use` does.
+//
+// To overcome that, a dummy module is created and aliases are re-exported
+// with `pub use` construct
+mod aliases {
+ use aws_sdk_dynamodb::types::AttributeValue;
+ use std::collections::HashMap;
+ pub type AttributeMap = HashMap<String, AttributeValue>;
+}
+pub use self::aliases::AttributeMap;
+
+// # Error handling
+
#[derive(
Debug, derive_more::Display, derive_more::From, derive_more::Error,
)]
@@ -167,7 +183,7 @@
}
}
-impl TryFromAttribute for HashMap<String, AttributeValue> {
+impl TryFromAttribute for AttributeMap {
fn try_from_attr(
attribute_name: impl Into<String>,
attribute_value: Option<AttributeValue>,
@@ -233,11 +249,11 @@
DateTime::<Utc>::try_from_attr(attribute_name, attribute_value)
}
-#[deprecated = "Use `HashMap::<String, AttributeValue>::try_from_attr()` instead"]
+#[deprecated = "Use `AttributeMap::try_from_attr()` instead"]
pub fn parse_map_attribute(
attribute_name: impl Into<String>,
attribute_value: Option<AttributeValue>,
-) -> Result<HashMap<String, AttributeValue>, DBItemError> {
+) -> Result<AttributeMap, DBItemError> {
attribute_value.attr_try_into(attribute_name)
}
diff --git a/services/feature-flags/src/database.rs b/services/feature-flags/src/database.rs
--- a/services/feature-flags/src/database.rs
+++ b/services/feature-flags/src/database.rs
@@ -5,7 +5,9 @@
PLATFORM_IOS,
};
use aws_sdk_dynamodb::types::{AttributeValue, Select};
-use comm_services_lib::database::{self, DBItemError, Error};
+use comm_services_lib::database::{
+ self, AttributeMap, DBItemError, Error, TryFromAttribute,
+};
use std::collections::HashMap;
use std::sync::Arc;
use tracing::error;
@@ -20,12 +22,12 @@
value: Option<AttributeValue>,
) -> Result<CodeVersionSpecificFeatureConfig, DBItemError> {
let mut code_version_config_map =
- database::parse_map_attribute(FEATURE_FLAGS_CONFIG_FIELD, value)?;
- let staff = database::parse_bool_attribute(
+ AttributeMap::try_from_attr(FEATURE_FLAGS_CONFIG_FIELD, value)?;
+ let staff = bool::try_from_attr(
FEATURE_FLAGS_STAFF_FIELD,
code_version_config_map.remove(FEATURE_FLAGS_STAFF_FIELD),
)?;
- let non_staff = database::parse_bool_attribute(
+ let non_staff = bool::try_from_attr(
FEATURE_FLAGS_NON_STAFF_FIELD,
code_version_config_map.remove(FEATURE_FLAGS_NON_STAFF_FIELD),
)?;
@@ -39,13 +41,13 @@
}
fn parse_feature_config(
- mut attribute_value: HashMap<String, AttributeValue>,
+ mut attribute_value: AttributeMap,
) -> Result<FeatureConfig, DBItemError> {
- let feature_name = database::parse_string_attribute(
+ let feature_name = String::try_from_attr(
FEATURE_FLAGS_FEATURE_FIELD,
attribute_value.remove(FEATURE_FLAGS_FEATURE_FIELD),
)?;
- let config_map = database::parse_map_attribute(
+ let config_map = AttributeMap::try_from_attr(
FEATURE_FLAGS_CONFIG_FIELD,
attribute_value.remove(FEATURE_FLAGS_CONFIG_FIELD),
)?;

File Metadata

Mime Type
text/plain
Expires
Thu, Nov 14, 7:09 PM (10 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2492194
Default Alt Text
D8850.id30019.diff (8 KB)

Event Timeline