dynoxide/actions/
describe_table.rs1use crate::actions::{TableDescription, build_table_description};
2use crate::errors::{DynoxideError, Result};
3use crate::storage::Storage;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Default, Deserialize)]
8struct DescribeTableRequestRaw {
9 #[serde(rename = "TableName", default)]
10 table_name: Option<String>,
11}
12
13#[derive(Debug, Default)]
14pub struct DescribeTableRequest {
15 pub table_name: String,
16}
17
18impl<'de> serde::Deserialize<'de> for DescribeTableRequest {
19 fn deserialize<D: serde::Deserializer<'de>>(
20 deserializer: D,
21 ) -> std::result::Result<Self, D::Error> {
22 let raw = DescribeTableRequestRaw::deserialize(deserializer)?;
23
24 if raw.table_name.is_none() {
25 return Err(serde::de::Error::custom(
26 "VALIDATION:The parameter 'TableName' is required but was not present in the request",
27 ));
28 }
29 let table_name = raw.table_name.unwrap();
30
31 if table_name.len() < 3 || table_name.len() > 255 {
33 return Err(serde::de::Error::custom(
34 "VALIDATION:TableName must be at least 3 characters long and at most 255 characters long",
35 ));
36 }
37
38 if !table_name
40 .chars()
41 .all(|c| c.is_ascii_alphanumeric() || c == '_' || c == '-' || c == '.')
42 {
43 return Err(serde::de::Error::custom(format!(
44 "VALIDATION:1 validation error detected: \
45 Value '{}' at 'tableName' failed to satisfy constraint: \
46 Member must satisfy regular expression pattern: [a-zA-Z0-9_.-]+",
47 table_name
48 )));
49 }
50
51 Ok(DescribeTableRequest { table_name })
52 }
53}
54
55#[derive(Debug, Default, Serialize)]
56pub struct DescribeTableResponse {
57 #[serde(rename = "Table")]
58 pub table: TableDescription,
59}
60
61pub fn execute(storage: &Storage, request: DescribeTableRequest) -> Result<DescribeTableResponse> {
62 crate::validation::validate_table_name(&request.table_name)?;
64
65 let meta = storage
66 .get_table_metadata(&request.table_name)?
67 .ok_or_else(|| {
68 DynoxideError::ResourceNotFoundException(format!(
69 "Requested resource not found: Table: {} not found",
70 request.table_name
71 ))
72 })?;
73
74 let item_count = storage.count_items(&request.table_name).ok();
76 let table_size_bytes = item_count.map(|_| 0i64); let desc = build_table_description(&meta, item_count, table_size_bytes);
79
80 Ok(DescribeTableResponse { table: desc })
81}