Skip to main content

sol_log_parser/structured_log/
parsed.rs

1use 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
37/* *************************************************************************** *
38 *  HELPER CODE
39 * *************************************************************************** */
40
41mod 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}