aleph_types/message/execution/
base.rs1use crate::chain::{Address, Chain};
2use crate::item_hash::ItemHash;
3use crate::message::execution::environment::{HostRequirements, MachineResources};
4use crate::message::execution::volume::MachineVolume;
5use serde::{Deserialize, Deserializer, Serialize};
6use std::collections::HashMap;
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
10#[serde(rename_all = "lowercase")]
11pub enum Encoding {
12 Plain,
13 Zip,
14 Squashfs,
15}
16
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
18#[serde(rename_all = "lowercase")]
19pub enum PaymentType {
20 Hold,
21 Superfluid,
22 Credit,
23}
24
25#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
26pub struct Payment {
27 #[serde(default)]
29 pub chain: Option<Chain>,
30 #[serde(default)]
32 pub receiver: Option<Address>,
33 #[serde(rename = "type")]
34 pub payment_type: PaymentType,
35}
36
37#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
39#[serde(rename_all = "lowercase")]
40pub enum Interface {
41 Asgi,
42 Binary,
43}
44
45fn deserialize_metadata_tolerant<'de, D>(
48 deserializer: D,
49) -> Result<Option<HashMap<String, serde_json::Value>>, D::Error>
50where
51 D: Deserializer<'de>,
52{
53 use serde_json::Value;
54
55 let value = Option::<Value>::deserialize(deserializer)?;
56
57 match value {
58 None => Ok(None),
59 Some(Value::Object(map)) => Ok(Some(map.into_iter().collect())),
60 Some(Value::Array(arr)) if arr.is_empty() => {
61 Ok(Some(HashMap::new()))
63 }
64 Some(other) => Err(serde::de::Error::custom(format!(
65 "expected object or empty array for metadata, got {}",
66 other
67 ))),
68 }
69}
70
71#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
73#[serde(rename_all = "lowercase")]
74pub struct ExecutableContent {
75 pub allow_amend: bool,
77 #[serde(default, deserialize_with = "deserialize_metadata_tolerant")]
79 pub metadata: Option<HashMap<String, serde_json::Value>>,
80 #[serde(default)]
82 pub variables: Option<HashMap<String, String>>,
83 pub resources: MachineResources,
85 #[serde(default)]
87 pub payment: Option<Payment>,
88 #[serde(default)]
89 pub requirements: Option<HostRequirements>,
90 #[serde(default)]
92 pub volumes: Vec<MachineVolume>,
93 #[serde(default)]
95 pub replaces: Option<ItemHash>,
96 #[serde(default)]
97 pub authorized_keys: Option<Vec<String>>,
98}