sol_log_parser/structured_log/
parsed.rs1use solana_pubkey::Pubkey;
2
3use crate::{
4 parsed_log::{ParsedDataLog, ParsedLog, ParsedProgramLog},
5 Result,
6};
7
8use super::{ComputeUnits, Log2};
9
10#[derive(Debug, Clone, PartialEq, Eq)]
11pub struct ParsedStructuredLog {
12 pub program_id: Pubkey,
13 pub depth: u8,
14 pub result: ParsedProgramResult,
15 pub program_logs: Vec<ParsedProgramLog>,
16 pub data_logs: Vec<ParsedDataLog>,
17 pub return_data: Option<Vec<u8>>,
18 pub compute_log: Option<ComputeUnits>,
19 pub cpi_logs: Vec<Self>,
20 pub raw_logs: Vec<String>,
21}
22
23impl ParsedStructuredLog {
24 pub fn from_parsed_logs(logs: Vec<ParsedLog>) -> Result<Vec<Self>> {
25 let log2: Vec<_> = logs.into_iter().map(Log2::from).collect();
26 let structured_log = helper_code::ParsedStructuredLogHelper::from_logs(log2)?;
27 Ok(structured_log.into_iter().map(Self::from).collect())
28 }
29}
30
31#[derive(Debug, Clone, PartialEq, Eq)]
32pub enum ParsedProgramResult {
33 Success,
34 Err(String),
35}
36
37mod helper_code {
42 use solana_pubkey::Pubkey;
43
44 use crate::{
45 parsed_log::{ParsedDataLog, ParsedProgramLog},
46 structured_log::{ProgramResult, StructuredLog},
47 };
48
49 use super::{ParsedProgramResult, ParsedStructuredLog};
50
51 impl From<ParsedStructuredLogHelper> for ParsedStructuredLog {
52 fn from(value: ParsedStructuredLogHelper) -> Self {
53 Self {
54 program_id: value.program_id,
55 depth: value.depth,
56 result: match value.result {
57 ProgramResult::Success => ParsedProgramResult::Success,
58 ProgramResult::Err(err) => ParsedProgramResult::Err(err),
59 },
60 program_logs: value.program_logs,
61 data_logs: value.data_logs,
62 return_data: value.return_data,
63 compute_log: value.compute_log,
64 cpi_logs: value.cpi_logs.into_iter().map(Self::from).collect(),
65 raw_logs: value.raw_logs,
66 }
67 }
68 }
69
70 pub type ParsedStructuredLogHelper = StructuredLog<
71 Pubkey,
72 ProgramResult<String>,
73 ParsedProgramLog,
74 ParsedDataLog,
75 Vec<u8>,
76 String,
77 >;
78}