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, skip_serializing_if = "Option::is_none")]
29 pub chain: Option<Chain>,
30 #[serde(default, skip_serializing_if = "Option::is_none")]
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(
79 default,
80 deserialize_with = "deserialize_metadata_tolerant",
81 skip_serializing_if = "Option::is_none"
82 )]
83 pub metadata: Option<HashMap<String, serde_json::Value>>,
84 #[serde(default, skip_serializing_if = "Option::is_none")]
86 pub variables: Option<HashMap<String, String>>,
87 pub resources: MachineResources,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
91 pub payment: Option<Payment>,
92 #[serde(default, skip_serializing_if = "Option::is_none")]
93 pub requirements: Option<HostRequirements>,
94 #[serde(default)]
96 pub volumes: Vec<MachineVolume>,
97 #[serde(default, skip_serializing_if = "Option::is_none")]
99 pub replaces: Option<ItemHash>,
100 #[serde(default, skip_serializing_if = "Option::is_none")]
101 pub authorized_keys: Option<Vec<String>>,
102}