Skip to content

Commit 69928ce

Browse files
committed
Add AbiMeta params for custom data retrieval
chore: * add AsRef impl for some structs for custom serialization
1 parent 7b0129d commit 69928ce

5 files changed

Lines changed: 122 additions & 3 deletions

File tree

src/lib.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,14 @@ impl TemplateProgram {
8989
debug_symbols: self.simfony.debug_symbols(self.file.as_ref()),
9090
simplicity: commit,
9191
witness_types: self.simfony.witness_types().shallow_clone(),
92+
parameter_types: self.simfony.parameters().shallow_clone(),
93+
})
94+
}
95+
96+
pub fn generate_abi_meta(&self) -> Result<AbiMeta, String> {
97+
Ok(AbiMeta {
98+
witness_types: self.simfony.witness_types().shallow_clone(),
99+
param_types: self.parameters().shallow_clone(),
92100
})
93101
}
94102
}
@@ -99,6 +107,7 @@ pub struct CompiledProgram {
99107
simplicity: Arc<named::CommitNode<Elements>>,
100108
witness_types: WitnessTypes,
101109
debug_symbols: DebugSymbols,
110+
parameter_types: Parameters,
102111
}
103112

104113
impl CompiledProgram {
@@ -162,6 +171,19 @@ impl CompiledProgram {
162171
debug_symbols: self.debug_symbols.clone(),
163172
})
164173
}
174+
175+
pub fn generate_abi_meta(&self) -> Result<AbiMeta, String> {
176+
Ok(AbiMeta {
177+
witness_types: self.witness_types.shallow_clone(),
178+
param_types: self.parameter_types.shallow_clone(),
179+
})
180+
}
181+
}
182+
183+
#[derive(Clone, Debug, Eq, PartialEq)]
184+
pub struct AbiMeta {
185+
pub witness_types: WitnessTypes,
186+
pub param_types: Parameters,
165187
}
166188

167189
/// A SimplicityHL program, compiled to Simplicity and satisfied with witness data.

src/main.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use base64::display::Base64Display;
22
use base64::engine::general_purpose::STANDARD;
33
use clap::{Arg, ArgAction, Command};
44

5-
use simplicityhl::{Arguments, CompiledProgram};
5+
use simplicityhl::{AbiMeta, Arguments, CompiledProgram};
66
use std::{env, fmt};
77

88
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
@@ -12,6 +12,8 @@ struct Output {
1212
program: String,
1313
/// Simplicity witness result, base64 encoded, if the .wit file was provided.
1414
witness: Option<String>,
15+
/// Simplicity program ABI metadata to the program which the user provides.
16+
abi_meta: Option<AbiMeta>,
1517
}
1618

1719
impl fmt::Display for Output {
@@ -20,6 +22,9 @@ impl fmt::Display for Output {
2022
if let Some(witness) = &self.witness {
2123
writeln!(f, "Witness:\n{}", witness)?;
2224
}
25+
if let Some(witness) = &self.abi_meta {
26+
writeln!(f, "ABI meta:\n{:?}", witness)?;
27+
}
2328
Ok(())
2429
}
2530
}
@@ -59,6 +64,12 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
5964
.action(ArgAction::SetTrue)
6065
.help("Output in JSON"),
6166
)
67+
.arg(
68+
Arg::new("abi")
69+
.long("abi")
70+
.action(ArgAction::SetTrue)
71+
.help("Additional ABI .simf contract types"),
72+
)
6273
};
6374

6475
let matches = command.get_matches();
@@ -68,6 +79,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
6879
let prog_text = std::fs::read_to_string(prog_path).map_err(|e| e.to_string())?;
6980
let include_debug_symbols = matches.get_flag("debug");
7081
let output_json = matches.get_flag("json");
82+
let abi_param = matches.get_flag("abi");
7183

7284
let compiled = CompiledProgram::new(prog_text, Arguments::default(), include_debug_symbols)?;
7385

@@ -103,9 +115,16 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
103115
}
104116
};
105117

118+
let abi_opt = if abi_param {
119+
Some(compiled.generate_abi_meta()?)
120+
} else {
121+
None
122+
};
123+
106124
let output = Output {
107125
program: Base64Display::new(&program_bytes, &STANDARD).to_string(),
108126
witness: witness_bytes.map(|bytes| Base64Display::new(&bytes, &STANDARD).to_string()),
127+
abi_meta: abi_opt,
109128
};
110129

111130
if output_json {

src/serde.rs

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use std::collections::HashMap;
22
use std::fmt;
33

4-
use serde::{de, ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer};
5-
64
use crate::parse::ParseFromStr;
75
use crate::str::WitnessName;
86
use crate::types::ResolvedType;
97
use crate::value::Value;
108
use crate::witness::{Arguments, WitnessValues};
9+
use crate::{AbiMeta, Parameters, WitnessTypes};
10+
use serde::{de, ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer};
1111

1212
struct WitnessMapVisitor;
1313

@@ -43,6 +43,66 @@ impl<'de> Deserialize<'de> for WitnessValues {
4343
}
4444
}
4545

46+
impl Serialize for ResolvedType {
47+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
48+
where
49+
S: Serializer,
50+
{
51+
serializer.serialize_str(&self.to_string())
52+
}
53+
}
54+
55+
impl Serialize for WitnessName {
56+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
57+
where
58+
S: Serializer,
59+
{
60+
serializer.serialize_str(self.as_ref())
61+
}
62+
}
63+
64+
impl Serialize for AbiMeta {
65+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
66+
where
67+
S: ::serde::Serializer,
68+
{
69+
use ::serde::ser::SerializeStruct;
70+
71+
let mut state = serializer.serialize_struct("AbiMeta", 2)?;
72+
state.serialize_field("witness_types", &self.witness_types)?;
73+
state.serialize_field("parameter_types", &self.param_types)?;
74+
state.end()
75+
}
76+
}
77+
78+
impl Serialize for Parameters {
79+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
80+
where
81+
S: Serializer,
82+
{
83+
let map_ref = self.as_ref();
84+
let mut map = serializer.serialize_map(Some(map_ref.len()))?;
85+
for (key, value) in map_ref {
86+
map.serialize_entry(key, value)?;
87+
}
88+
map.end()
89+
}
90+
}
91+
92+
impl Serialize for WitnessTypes {
93+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
94+
where
95+
S: Serializer,
96+
{
97+
let map_ref = self.as_ref();
98+
let mut map = serializer.serialize_map(Some(map_ref.len()))?;
99+
for (key, value) in map_ref {
100+
map.serialize_entry(key, value)?;
101+
}
102+
map.end()
103+
}
104+
}
105+
46106
impl<'de> Deserialize<'de> for Arguments {
47107
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
48108
where

src/str.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,12 @@ pub struct WitnessName(Arc<str>);
125125
wrapped_string!(WitnessName, "witness name");
126126
impl_arbitrary_lowercase_alpha!(WitnessName);
127127

128+
impl AsRef<str> for WitnessName {
129+
fn as_ref(&self) -> &str {
130+
self.0.as_ref()
131+
}
132+
}
133+
128134
/// The name of a jet.
129135
#[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
130136
pub struct JetName(Arc<str>);

src/witness.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@ pub struct WitnessTypes(Arc<HashMap<WitnessName, ResolvedType>>);
9494

9595
impl_name_type_map!(WitnessTypes);
9696

97+
impl AsRef<HashMap<WitnessName, ResolvedType>> for WitnessTypes {
98+
fn as_ref(&self) -> &HashMap<WitnessName, ResolvedType> {
99+
self.0.as_ref()
100+
}
101+
}
102+
97103
/// Map of witness values.
98104
#[derive(Clone, Debug, Eq, PartialEq, Default)]
99105
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
@@ -151,6 +157,12 @@ pub struct Parameters(Arc<HashMap<WitnessName, ResolvedType>>);
151157

152158
impl_name_type_map!(Parameters);
153159

160+
impl AsRef<HashMap<WitnessName, ResolvedType>> for Parameters {
161+
fn as_ref(&self) -> &HashMap<WitnessName, ResolvedType> {
162+
self.0.as_ref()
163+
}
164+
}
165+
154166
/// Map of arguments.
155167
///
156168
/// An argument is the value of a parameter.

0 commit comments

Comments
 (0)