topsoil_core/
view_functions.rs1use alloc::vec::Vec;
10use codec::{Decode, DecodeAll, Encode, Output};
11use scale_info::TypeInfo;
12use Debug;
13
14#[derive(Clone, Encode, Decode, Debug, TypeInfo)]
16pub struct ViewFunctionId {
17 pub prefix: [u8; 16],
22 pub suffix: [u8; 16],
24}
25
26impl From<ViewFunctionId> for [u8; 32] {
27 fn from(value: ViewFunctionId) -> Self {
28 let mut output = [0u8; 32];
29 output[..16].copy_from_slice(&value.prefix);
30 output[16..].copy_from_slice(&value.suffix);
31 output
32 }
33}
34
35#[derive(Encode, Decode, Debug, TypeInfo)]
37pub enum ViewFunctionDispatchError {
38 NotImplemented,
40 NotFound(ViewFunctionId),
42 Codec,
44}
45
46impl From<codec::Error> for ViewFunctionDispatchError {
47 fn from(_: codec::Error) -> Self {
48 ViewFunctionDispatchError::Codec
49 }
50}
51
52pub trait DispatchViewFunction {
62 fn dispatch_view_function<O: Output>(
63 id: &ViewFunctionId,
64 input: &mut &[u8],
65 output: &mut O,
66 ) -> Result<(), ViewFunctionDispatchError>;
67}
68
69impl DispatchViewFunction for () {
70 fn dispatch_view_function<O: Output>(
71 _id: &ViewFunctionId,
72 _input: &mut &[u8],
73 _output: &mut O,
74 ) -> Result<(), ViewFunctionDispatchError> {
75 Err(ViewFunctionDispatchError::NotImplemented)
76 }
77}
78
79pub trait ViewFunctionIdPrefix {
81 fn prefix() -> [u8; 16];
82}
83
84pub trait ViewFunctionIdSuffix {
87 const SUFFIX: [u8; 16];
88}
89
90pub trait ViewFunction: DecodeAll {
93 fn id() -> ViewFunctionId;
94 type ReturnType: Encode;
95
96 fn invoke(self) -> Self::ReturnType;
97
98 fn execute<O: Output>(
99 input: &mut &[u8],
100 output: &mut O,
101 ) -> Result<(), ViewFunctionDispatchError> {
102 let view_function = Self::decode_all(input)?;
103 let result = view_function.invoke();
104 Encode::encode_to(&result, output);
105 Ok(())
106 }
107}
108
109pub mod runtime_api {
110 use super::*;
111
112 subsoil::api::decl_runtime_apis! {
113 #[api_version(1)]
114 pub trait RuntimeViewFunction {
116 fn execute_view_function(
118 query_id: ViewFunctionId,
119 input: Vec<u8>,
120 ) -> Result<Vec<u8>, ViewFunctionDispatchError>;
121 }
122 }
123}