
// This file was automatically derived from the JSON-RPC schemas in
// `doc/schemas`. Do not edit this file manually as it would get
// overwritten.

use std::convert::From;
#[allow(unused_imports)]
use cln_rpc::model::{responses,requests};
use crate::pb;
use std::str::FromStr;
use bitcoin::hashes::sha256::Hash as Sha256;
use bitcoin::hashes::Hash;
use cln_rpc::primitives::PublicKey;

#[allow(unused_variables)]
impl From<responses::GetinfoOur_features> for pb::GetinfoOurFeatures {
    fn from(c: responses::GetinfoOur_features) -> Self {
        Self {
            init: hex::decode(&c.init).unwrap(), // Rule #2 for type hex
            node: hex::decode(&c.node).unwrap(), // Rule #2 for type hex
            channel: hex::decode(&c.channel).unwrap(), // Rule #2 for type hex
            invoice: hex::decode(&c.invoice).unwrap(), // Rule #2 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<responses::GetinfoAddress> for pb::GetinfoAddress {
    fn from(c: responses::GetinfoAddress) -> Self {
        Self {
            item_type: c.item_type as i32,
            port: c.port.into(), // Rule #2 for type u16
            address: c.address, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::GetinfoBinding> for pb::GetinfoBinding {
    fn from(c: responses::GetinfoBinding) -> Self {
        Self {
            item_type: c.item_type as i32,
            address: c.address, // Rule #2 for type string?
            port: c.port.map(|v| v.into()), // Rule #2 for type u16?
            socket: c.socket, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::GetinfoResponse> for pb::GetinfoResponse {
    fn from(c: responses::GetinfoResponse) -> Self {
        Self {
            id: c.id.serialize().to_vec(), // Rule #2 for type pubkey
            alias: c.alias, // Rule #2 for type string?
            color: hex::decode(&c.color).unwrap(), // Rule #2 for type hex
            num_peers: c.num_peers, // Rule #2 for type u32
            num_pending_channels: c.num_pending_channels, // Rule #2 for type u32
            num_active_channels: c.num_active_channels, // Rule #2 for type u32
            num_inactive_channels: c.num_inactive_channels, // Rule #2 for type u32
            version: c.version, // Rule #2 for type string
            lightning_dir: c.lightning_dir, // Rule #2 for type string
            our_features: c.our_features.map(|v| v.into()),
            blockheight: c.blockheight, // Rule #2 for type u32
            network: c.network, // Rule #2 for type string
            fees_collected_msat: Some(c.fees_collected_msat.into()), // Rule #2 for type msat
            // Field: Getinfo.address[]
            address: c.address.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            // Field: Getinfo.binding[]
            binding: c.binding.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            warning_bitcoind_sync: c.warning_bitcoind_sync, // Rule #2 for type string?
            warning_lightningd_sync: c.warning_lightningd_sync, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeersPeersLog> for pb::ListpeersPeersLog {
    fn from(c: responses::ListpeersPeersLog) -> Self {
        Self {
            item_type: c.item_type as i32,
            num_skipped: c.num_skipped, // Rule #2 for type u32?
            time: c.time, // Rule #2 for type string?
            source: c.source, // Rule #2 for type string?
            log: c.log, // Rule #2 for type string?
            node_id: c.node_id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            data: c.data.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeersPeersChannelsFeerate> for pb::ListpeersPeersChannelsFeerate {
    fn from(c: responses::ListpeersPeersChannelsFeerate) -> Self {
        Self {
            perkw: c.perkw, // Rule #2 for type u32
            perkb: c.perkb, // Rule #2 for type u32
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeersPeersChannelsInflight> for pb::ListpeersPeersChannelsInflight {
    fn from(c: responses::ListpeersPeersChannelsInflight) -> Self {
        Self {
            funding_txid: hex::decode(&c.funding_txid).unwrap(), // Rule #2 for type txid
            funding_outnum: c.funding_outnum, // Rule #2 for type u32
            feerate: c.feerate, // Rule #2 for type string
            total_funding_msat: Some(c.total_funding_msat.into()), // Rule #2 for type msat
            our_funding_msat: Some(c.our_funding_msat.into()), // Rule #2 for type msat
            scratch_txid: hex::decode(&c.scratch_txid).unwrap(), // Rule #2 for type txid
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeersPeersChannelsFunding> for pb::ListpeersPeersChannelsFunding {
    fn from(c: responses::ListpeersPeersChannelsFunding) -> Self {
        Self {
            pushed_msat: c.pushed_msat.map(|f| f.into()), // Rule #2 for type msat?
            local_funds_msat: Some(c.local_funds_msat.into()), // Rule #2 for type msat
            remote_funds_msat: Some(c.remote_funds_msat.into()), // Rule #2 for type msat
            fee_paid_msat: c.fee_paid_msat.map(|f| f.into()), // Rule #2 for type msat?
            fee_rcvd_msat: c.fee_rcvd_msat.map(|f| f.into()), // Rule #2 for type msat?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeersPeersChannelsAlias> for pb::ListpeersPeersChannelsAlias {
    fn from(c: responses::ListpeersPeersChannelsAlias) -> Self {
        Self {
            local: c.local.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
            remote: c.remote.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeersPeersChannelsHtlcs> for pb::ListpeersPeersChannelsHtlcs {
    fn from(c: responses::ListpeersPeersChannelsHtlcs) -> Self {
        Self {
            direction: c.direction as i32,
            id: c.id, // Rule #2 for type u64
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            expiry: c.expiry, // Rule #2 for type u32
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            local_trimmed: c.local_trimmed, // Rule #2 for type boolean?
            status: c.status, // Rule #2 for type string?
            state: c.state as i32,
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeersPeersChannels> for pb::ListpeersPeersChannels {
    fn from(c: responses::ListpeersPeersChannels) -> Self {
        Self {
            state: c.state as i32,
            scratch_txid: c.scratch_txid.map(|v| hex::decode(v).unwrap()), // Rule #2 for type txid?
            feerate: c.feerate.map(|v| v.into()),
            owner: c.owner, // Rule #2 for type string?
            short_channel_id: c.short_channel_id.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
            channel_id: c.channel_id.map(|v| v.to_vec()), // Rule #2 for type hash?
            funding_txid: c.funding_txid.map(|v| hex::decode(v).unwrap()), // Rule #2 for type txid?
            funding_outnum: c.funding_outnum, // Rule #2 for type u32?
            initial_feerate: c.initial_feerate, // Rule #2 for type string?
            last_feerate: c.last_feerate, // Rule #2 for type string?
            next_feerate: c.next_feerate, // Rule #2 for type string?
            next_fee_step: c.next_fee_step, // Rule #2 for type u32?
            // Field: ListPeers.peers[].channels[].inflight[]
            inflight: c.inflight.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            close_to: c.close_to.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            private: c.private, // Rule #2 for type boolean?
            opener: c.opener as i32,
            closer: c.closer.map(|v| v as i32),
            // Field: ListPeers.peers[].channels[].features[]
            features: c.features.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListpeersPeersChannelsFeatures
            funding: c.funding.map(|v| v.into()),
            to_us_msat: c.to_us_msat.map(|f| f.into()), // Rule #2 for type msat?
            min_to_us_msat: c.min_to_us_msat.map(|f| f.into()), // Rule #2 for type msat?
            max_to_us_msat: c.max_to_us_msat.map(|f| f.into()), // Rule #2 for type msat?
            total_msat: c.total_msat.map(|f| f.into()), // Rule #2 for type msat?
            fee_base_msat: c.fee_base_msat.map(|f| f.into()), // Rule #2 for type msat?
            fee_proportional_millionths: c.fee_proportional_millionths, // Rule #2 for type u32?
            dust_limit_msat: c.dust_limit_msat.map(|f| f.into()), // Rule #2 for type msat?
            max_total_htlc_in_msat: c.max_total_htlc_in_msat.map(|f| f.into()), // Rule #2 for type msat?
            their_reserve_msat: c.their_reserve_msat.map(|f| f.into()), // Rule #2 for type msat?
            our_reserve_msat: c.our_reserve_msat.map(|f| f.into()), // Rule #2 for type msat?
            spendable_msat: c.spendable_msat.map(|f| f.into()), // Rule #2 for type msat?
            receivable_msat: c.receivable_msat.map(|f| f.into()), // Rule #2 for type msat?
            minimum_htlc_in_msat: c.minimum_htlc_in_msat.map(|f| f.into()), // Rule #2 for type msat?
            minimum_htlc_out_msat: c.minimum_htlc_out_msat.map(|f| f.into()), // Rule #2 for type msat?
            maximum_htlc_out_msat: c.maximum_htlc_out_msat.map(|f| f.into()), // Rule #2 for type msat?
            their_to_self_delay: c.their_to_self_delay, // Rule #2 for type u32?
            our_to_self_delay: c.our_to_self_delay, // Rule #2 for type u32?
            max_accepted_htlcs: c.max_accepted_htlcs, // Rule #2 for type u32?
            alias: c.alias.map(|v| v.into()),
            // Field: ListPeers.peers[].channels[].status[]
            status: c.status.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            in_payments_offered: c.in_payments_offered, // Rule #2 for type u64?
            in_offered_msat: c.in_offered_msat.map(|f| f.into()), // Rule #2 for type msat?
            in_payments_fulfilled: c.in_payments_fulfilled, // Rule #2 for type u64?
            in_fulfilled_msat: c.in_fulfilled_msat.map(|f| f.into()), // Rule #2 for type msat?
            out_payments_offered: c.out_payments_offered, // Rule #2 for type u64?
            out_offered_msat: c.out_offered_msat.map(|f| f.into()), // Rule #2 for type msat?
            out_payments_fulfilled: c.out_payments_fulfilled, // Rule #2 for type u64?
            out_fulfilled_msat: c.out_fulfilled_msat.map(|f| f.into()), // Rule #2 for type msat?
            // Field: ListPeers.peers[].channels[].htlcs[]
            htlcs: c.htlcs.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            close_to_addr: c.close_to_addr, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables,deprecated)]
impl From<responses::ListpeersPeers> for pb::ListpeersPeers {
    fn from(c: responses::ListpeersPeers) -> Self {
        Self {
            id: c.id.serialize().to_vec(), // Rule #2 for type pubkey
            connected: c.connected, // Rule #2 for type boolean
            num_channels: c.num_channels, // Rule #2 for type u32?
            // Field: ListPeers.peers[].log[]
            log: c.log.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            // Field: ListPeers.peers[].channels[]
            channels: c.channels.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            // Field: ListPeers.peers[].netaddr[]
            netaddr: c.netaddr.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            remote_addr: c.remote_addr, // Rule #2 for type string?
            features: c.features.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeersResponse> for pb::ListpeersResponse {
    fn from(c: responses::ListpeersResponse) -> Self {
        Self {
            // Field: ListPeers.peers[]
            peers: c.peers.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListpeersPeers
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListfundsOutputs> for pb::ListfundsOutputs {
    fn from(c: responses::ListfundsOutputs) -> Self {
        Self {
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
            output: c.output, // Rule #2 for type u32
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            scriptpubkey: hex::decode(&c.scriptpubkey).unwrap(), // Rule #2 for type hex
            address: c.address, // Rule #2 for type string?
            redeemscript: c.redeemscript.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            status: c.status as i32,
            reserved: c.reserved, // Rule #2 for type boolean
            blockheight: c.blockheight, // Rule #2 for type u32?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListfundsChannels> for pb::ListfundsChannels {
    fn from(c: responses::ListfundsChannels) -> Self {
        Self {
            peer_id: c.peer_id.serialize().to_vec(), // Rule #2 for type pubkey
            our_amount_msat: Some(c.our_amount_msat.into()), // Rule #2 for type msat
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            funding_txid: hex::decode(&c.funding_txid).unwrap(), // Rule #2 for type txid
            funding_output: c.funding_output, // Rule #2 for type u32
            connected: c.connected, // Rule #2 for type boolean
            state: c.state as i32,
            channel_id: c.channel_id.map(|v| v.to_vec()), // Rule #2 for type hash?
            short_channel_id: c.short_channel_id.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListfundsResponse> for pb::ListfundsResponse {
    fn from(c: responses::ListfundsResponse) -> Self {
        Self {
            // Field: ListFunds.outputs[]
            outputs: c.outputs.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListfundsOutputs
            // Field: ListFunds.channels[]
            channels: c.channels.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListfundsChannels
        }
    }
}

#[allow(unused_variables)]
impl From<responses::SendpayResponse> for pb::SendpayResponse {
    fn from(c: responses::SendpayResponse) -> Self {
        Self {
            id: c.id, // Rule #2 for type u64
            groupid: c.groupid, // Rule #2 for type u64?
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            status: c.status as i32,
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            created_at: c.created_at, // Rule #2 for type u64
            completed_at: c.completed_at, // Rule #2 for type u64?
            amount_sent_msat: Some(c.amount_sent_msat.into()), // Rule #2 for type msat
            label: c.label, // Rule #2 for type string?
            partid: c.partid, // Rule #2 for type u64?
            bolt11: c.bolt11, // Rule #2 for type string?
            bolt12: c.bolt12, // Rule #2 for type string?
            payment_preimage: c.payment_preimage.map(|v| v.to_vec()), // Rule #2 for type secret?
            message: c.message, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListchannelsChannels> for pb::ListchannelsChannels {
    fn from(c: responses::ListchannelsChannels) -> Self {
        Self {
            source: c.source.serialize().to_vec(), // Rule #2 for type pubkey
            destination: c.destination.serialize().to_vec(), // Rule #2 for type pubkey
            short_channel_id: c.short_channel_id.to_string(), // Rule #2 for type short_channel_id
            direction: c.direction, // Rule #2 for type u32
            public: c.public, // Rule #2 for type boolean
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            message_flags: c.message_flags.into(), // Rule #2 for type u8
            channel_flags: c.channel_flags.into(), // Rule #2 for type u8
            active: c.active, // Rule #2 for type boolean
            last_update: c.last_update, // Rule #2 for type u32
            base_fee_millisatoshi: c.base_fee_millisatoshi, // Rule #2 for type u32
            fee_per_millionth: c.fee_per_millionth, // Rule #2 for type u32
            delay: c.delay, // Rule #2 for type u32
            htlc_minimum_msat: Some(c.htlc_minimum_msat.into()), // Rule #2 for type msat
            htlc_maximum_msat: c.htlc_maximum_msat.map(|f| f.into()), // Rule #2 for type msat?
            features: hex::decode(&c.features).unwrap(), // Rule #2 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListchannelsResponse> for pb::ListchannelsResponse {
    fn from(c: responses::ListchannelsResponse) -> Self {
        Self {
            // Field: ListChannels.channels[]
            channels: c.channels.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListchannelsChannels
        }
    }
}

#[allow(unused_variables)]
impl From<responses::AddgossipResponse> for pb::AddgossipResponse {
    fn from(c: responses::AddgossipResponse) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<responses::AutocleaninvoiceResponse> for pb::AutocleaninvoiceResponse {
    fn from(c: responses::AutocleaninvoiceResponse) -> Self {
        Self {
            enabled: c.enabled, // Rule #2 for type boolean
            expired_by: c.expired_by, // Rule #2 for type u64?
            cycle_seconds: c.cycle_seconds, // Rule #2 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::CheckmessageResponse> for pb::CheckmessageResponse {
    fn from(c: responses::CheckmessageResponse) -> Self {
        Self {
            verified: c.verified, // Rule #2 for type boolean
            pubkey: c.pubkey.serialize().to_vec(), // Rule #2 for type pubkey
        }
    }
}

#[allow(unused_variables)]
impl From<responses::CloseResponse> for pb::CloseResponse {
    fn from(c: responses::CloseResponse) -> Self {
        Self {
            item_type: c.item_type as i32,
            tx: c.tx.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            txid: c.txid.map(|v| hex::decode(v).unwrap()), // Rule #2 for type txid?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ConnectAddress> for pb::ConnectAddress {
    fn from(c: responses::ConnectAddress) -> Self {
        Self {
            item_type: c.item_type as i32,
            socket: c.socket, // Rule #2 for type string?
            address: c.address, // Rule #2 for type string?
            port: c.port.map(|v| v.into()), // Rule #2 for type u16?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ConnectResponse> for pb::ConnectResponse {
    fn from(c: responses::ConnectResponse) -> Self {
        Self {
            id: c.id.serialize().to_vec(), // Rule #2 for type pubkey
            features: hex::decode(&c.features).unwrap(), // Rule #2 for type hex
            direction: c.direction as i32,
            address: Some(c.address.into()),
        }
    }
}

#[allow(unused_variables)]
impl From<responses::CreateinvoiceResponse> for pb::CreateinvoiceResponse {
    fn from(c: responses::CreateinvoiceResponse) -> Self {
        Self {
            label: c.label, // Rule #2 for type string
            bolt11: c.bolt11, // Rule #2 for type string?
            bolt12: c.bolt12, // Rule #2 for type string?
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            status: c.status as i32,
            description: c.description, // Rule #2 for type string
            expires_at: c.expires_at, // Rule #2 for type u64
            pay_index: c.pay_index, // Rule #2 for type u64?
            amount_received_msat: c.amount_received_msat.map(|f| f.into()), // Rule #2 for type msat?
            paid_at: c.paid_at, // Rule #2 for type u64?
            payment_preimage: c.payment_preimage.map(|v| v.to_vec()), // Rule #2 for type secret?
            local_offer_id: c.local_offer_id.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            invreq_payer_note: c.invreq_payer_note, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DatastoreResponse> for pb::DatastoreResponse {
    fn from(c: responses::DatastoreResponse) -> Self {
        Self {
            // Field: Datastore.key
            key: c.key.into_iter().map(|i| i.into()).collect(), // Rule #3 for type string
            generation: c.generation, // Rule #2 for type u64?
            hex: c.hex.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            string: c.string, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::CreateonionResponse> for pb::CreateonionResponse {
    fn from(c: responses::CreateonionResponse) -> Self {
        Self {
            onion: hex::decode(&c.onion).unwrap(), // Rule #2 for type hex
            // Field: CreateOnion.shared_secrets[]
            shared_secrets: c.shared_secrets.into_iter().map(|i| i.to_vec()).collect(), // Rule #3 for type secret
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DeldatastoreResponse> for pb::DeldatastoreResponse {
    fn from(c: responses::DeldatastoreResponse) -> Self {
        Self {
            // Field: DelDatastore.key
            key: c.key.into_iter().map(|i| i.into()).collect(), // Rule #3 for type string
            generation: c.generation, // Rule #2 for type u64?
            hex: c.hex.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            string: c.string, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DelexpiredinvoiceResponse> for pb::DelexpiredinvoiceResponse {
    fn from(c: responses::DelexpiredinvoiceResponse) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DelinvoiceResponse> for pb::DelinvoiceResponse {
    fn from(c: responses::DelinvoiceResponse) -> Self {
        Self {
            label: c.label, // Rule #2 for type string
            bolt11: c.bolt11, // Rule #2 for type string?
            bolt12: c.bolt12, // Rule #2 for type string?
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            description: c.description, // Rule #2 for type string?
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            status: c.status as i32,
            expires_at: c.expires_at, // Rule #2 for type u64
            local_offer_id: c.local_offer_id.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            invreq_payer_note: c.invreq_payer_note, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::InvoiceResponse> for pb::InvoiceResponse {
    fn from(c: responses::InvoiceResponse) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #2 for type string
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            payment_secret: c.payment_secret.to_vec(), // Rule #2 for type secret
            expires_at: c.expires_at, // Rule #2 for type u64
            warning_capacity: c.warning_capacity, // Rule #2 for type string?
            warning_offline: c.warning_offline, // Rule #2 for type string?
            warning_deadends: c.warning_deadends, // Rule #2 for type string?
            warning_private_unused: c.warning_private_unused, // Rule #2 for type string?
            warning_mpp: c.warning_mpp, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListdatastoreDatastore> for pb::ListdatastoreDatastore {
    fn from(c: responses::ListdatastoreDatastore) -> Self {
        Self {
            // Field: ListDatastore.datastore[].key[]
            key: c.key.into_iter().map(|i| i.into()).collect(), // Rule #3 for type string
            generation: c.generation, // Rule #2 for type u64?
            hex: c.hex.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            string: c.string, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListdatastoreResponse> for pb::ListdatastoreResponse {
    fn from(c: responses::ListdatastoreResponse) -> Self {
        Self {
            // Field: ListDatastore.datastore[]
            datastore: c.datastore.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListdatastoreDatastore
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListinvoicesInvoices> for pb::ListinvoicesInvoices {
    fn from(c: responses::ListinvoicesInvoices) -> Self {
        Self {
            label: c.label, // Rule #2 for type string
            description: c.description, // Rule #2 for type string?
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            status: c.status as i32,
            expires_at: c.expires_at, // Rule #2 for type u64
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            bolt11: c.bolt11, // Rule #2 for type string?
            bolt12: c.bolt12, // Rule #2 for type string?
            local_offer_id: c.local_offer_id.map(|v| v.to_vec()), // Rule #2 for type hash?
            invreq_payer_note: c.invreq_payer_note, // Rule #2 for type string?
            pay_index: c.pay_index, // Rule #2 for type u64?
            amount_received_msat: c.amount_received_msat.map(|f| f.into()), // Rule #2 for type msat?
            paid_at: c.paid_at, // Rule #2 for type u64?
            payment_preimage: c.payment_preimage.map(|v| v.to_vec()), // Rule #2 for type secret?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListinvoicesResponse> for pb::ListinvoicesResponse {
    fn from(c: responses::ListinvoicesResponse) -> Self {
        Self {
            // Field: ListInvoices.invoices[]
            invoices: c.invoices.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListinvoicesInvoices
        }
    }
}

#[allow(unused_variables)]
impl From<responses::SendonionResponse> for pb::SendonionResponse {
    fn from(c: responses::SendonionResponse) -> Self {
        Self {
            id: c.id, // Rule #2 for type u64
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            status: c.status as i32,
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            created_at: c.created_at, // Rule #2 for type u64
            amount_sent_msat: Some(c.amount_sent_msat.into()), // Rule #2 for type msat
            label: c.label, // Rule #2 for type string?
            bolt11: c.bolt11, // Rule #2 for type string?
            bolt12: c.bolt12, // Rule #2 for type string?
            partid: c.partid, // Rule #2 for type u64?
            payment_preimage: c.payment_preimage.map(|v| v.to_vec()), // Rule #2 for type secret?
            message: c.message, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListsendpaysPayments> for pb::ListsendpaysPayments {
    fn from(c: responses::ListsendpaysPayments) -> Self {
        Self {
            id: c.id, // Rule #2 for type u64
            groupid: c.groupid, // Rule #2 for type u64
            partid: c.partid, // Rule #2 for type u64?
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            status: c.status as i32,
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            created_at: c.created_at, // Rule #2 for type u64
            amount_sent_msat: Some(c.amount_sent_msat.into()), // Rule #2 for type msat
            label: c.label, // Rule #2 for type string?
            bolt11: c.bolt11, // Rule #2 for type string?
            description: c.description, // Rule #2 for type string?
            bolt12: c.bolt12, // Rule #2 for type string?
            payment_preimage: c.payment_preimage.map(|v| v.to_vec()), // Rule #2 for type secret?
            erroronion: c.erroronion.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListsendpaysResponse> for pb::ListsendpaysResponse {
    fn from(c: responses::ListsendpaysResponse) -> Self {
        Self {
            // Field: ListSendPays.payments[]
            payments: c.payments.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListsendpaysPayments
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListtransactionsTransactionsInputs> for pb::ListtransactionsTransactionsInputs {
    fn from(c: responses::ListtransactionsTransactionsInputs) -> Self {
        Self {
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
            index: c.index, // Rule #2 for type u32
            sequence: c.sequence, // Rule #2 for type u32
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListtransactionsTransactionsOutputs> for pb::ListtransactionsTransactionsOutputs {
    fn from(c: responses::ListtransactionsTransactionsOutputs) -> Self {
        Self {
            index: c.index, // Rule #2 for type u32
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            script_pub_key: hex::decode(&c.script_pub_key).unwrap(), // Rule #2 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListtransactionsTransactions> for pb::ListtransactionsTransactions {
    fn from(c: responses::ListtransactionsTransactions) -> Self {
        Self {
            hash: hex::decode(&c.hash).unwrap(), // Rule #2 for type txid
            rawtx: hex::decode(&c.rawtx).unwrap(), // Rule #2 for type hex
            blockheight: c.blockheight, // Rule #2 for type u32
            txindex: c.txindex, // Rule #2 for type u32
            locktime: c.locktime, // Rule #2 for type u32
            version: c.version, // Rule #2 for type u32
            // Field: ListTransactions.transactions[].inputs[]
            inputs: c.inputs.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListtransactionsTransactionsInputs
            // Field: ListTransactions.transactions[].outputs[]
            outputs: c.outputs.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListtransactionsTransactionsOutputs
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListtransactionsResponse> for pb::ListtransactionsResponse {
    fn from(c: responses::ListtransactionsResponse) -> Self {
        Self {
            // Field: ListTransactions.transactions[]
            transactions: c.transactions.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListtransactionsTransactions
        }
    }
}

#[allow(unused_variables)]
impl From<responses::PayResponse> for pb::PayResponse {
    fn from(c: responses::PayResponse) -> Self {
        Self {
            payment_preimage: c.payment_preimage.to_vec(), // Rule #2 for type secret
            destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            created_at: c.created_at, // Rule #2 for type number
            parts: c.parts, // Rule #2 for type u32
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            amount_sent_msat: Some(c.amount_sent_msat.into()), // Rule #2 for type msat
            warning_partial_completion: c.warning_partial_completion, // Rule #2 for type string?
            status: c.status as i32,
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListnodesNodesAddresses> for pb::ListnodesNodesAddresses {
    fn from(c: responses::ListnodesNodesAddresses) -> Self {
        Self {
            item_type: c.item_type as i32,
            port: c.port.into(), // Rule #2 for type u16
            address: c.address, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListnodesNodes> for pb::ListnodesNodes {
    fn from(c: responses::ListnodesNodes) -> Self {
        Self {
            nodeid: c.nodeid.serialize().to_vec(), // Rule #2 for type pubkey
            last_timestamp: c.last_timestamp, // Rule #2 for type u32?
            alias: c.alias, // Rule #2 for type string?
            color: c.color.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            features: c.features.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            // Field: ListNodes.nodes[].addresses[]
            addresses: c.addresses.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListnodesResponse> for pb::ListnodesResponse {
    fn from(c: responses::ListnodesResponse) -> Self {
        Self {
            // Field: ListNodes.nodes[]
            nodes: c.nodes.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListnodesNodes
        }
    }
}

#[allow(unused_variables)]
impl From<responses::WaitanyinvoiceResponse> for pb::WaitanyinvoiceResponse {
    fn from(c: responses::WaitanyinvoiceResponse) -> Self {
        Self {
            label: c.label, // Rule #2 for type string
            description: c.description, // Rule #2 for type string
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            status: c.status as i32,
            expires_at: c.expires_at, // Rule #2 for type u64
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            bolt11: c.bolt11, // Rule #2 for type string?
            bolt12: c.bolt12, // Rule #2 for type string?
            pay_index: c.pay_index, // Rule #2 for type u64?
            amount_received_msat: c.amount_received_msat.map(|f| f.into()), // Rule #2 for type msat?
            paid_at: c.paid_at, // Rule #2 for type u64?
            payment_preimage: c.payment_preimage.map(|v| v.to_vec()), // Rule #2 for type secret?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::WaitinvoiceResponse> for pb::WaitinvoiceResponse {
    fn from(c: responses::WaitinvoiceResponse) -> Self {
        Self {
            label: c.label, // Rule #2 for type string
            description: c.description, // Rule #2 for type string
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            status: c.status as i32,
            expires_at: c.expires_at, // Rule #2 for type u64
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            bolt11: c.bolt11, // Rule #2 for type string?
            bolt12: c.bolt12, // Rule #2 for type string?
            pay_index: c.pay_index, // Rule #2 for type u64?
            amount_received_msat: c.amount_received_msat.map(|f| f.into()), // Rule #2 for type msat?
            paid_at: c.paid_at, // Rule #2 for type u64?
            payment_preimage: c.payment_preimage.map(|v| v.to_vec()), // Rule #2 for type secret?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::WaitsendpayResponse> for pb::WaitsendpayResponse {
    fn from(c: responses::WaitsendpayResponse) -> Self {
        Self {
            id: c.id, // Rule #2 for type u64
            groupid: c.groupid, // Rule #2 for type u64?
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            status: c.status as i32,
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            created_at: c.created_at, // Rule #2 for type u64
            completed_at: c.completed_at, // Rule #2 for type number?
            amount_sent_msat: Some(c.amount_sent_msat.into()), // Rule #2 for type msat
            label: c.label, // Rule #2 for type string?
            partid: c.partid, // Rule #2 for type u64?
            bolt11: c.bolt11, // Rule #2 for type string?
            bolt12: c.bolt12, // Rule #2 for type string?
            payment_preimage: c.payment_preimage.map(|v| v.to_vec()), // Rule #2 for type secret?
        }
    }
}

#[allow(unused_variables,deprecated)]
impl From<responses::NewaddrResponse> for pb::NewaddrResponse {
    fn from(c: responses::NewaddrResponse) -> Self {
        Self {
            p2tr: c.p2tr, // Rule #2 for type string?
            bech32: c.bech32, // Rule #2 for type string?
            #[allow(deprecated)]
            p2sh_segwit: c.p2sh_segwit, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::WithdrawResponse> for pb::WithdrawResponse {
    fn from(c: responses::WithdrawResponse) -> Self {
        Self {
            tx: hex::decode(&c.tx).unwrap(), // Rule #2 for type hex
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
            psbt: c.psbt, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<responses::KeysendResponse> for pb::KeysendResponse {
    fn from(c: responses::KeysendResponse) -> Self {
        Self {
            payment_preimage: c.payment_preimage.to_vec(), // Rule #2 for type secret
            destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            created_at: c.created_at, // Rule #2 for type number
            parts: c.parts, // Rule #2 for type u32
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            amount_sent_msat: Some(c.amount_sent_msat.into()), // Rule #2 for type msat
            warning_partial_completion: c.warning_partial_completion, // Rule #2 for type string?
            status: c.status as i32,
        }
    }
}

#[allow(unused_variables)]
impl From<responses::FundpsbtReservations> for pb::FundpsbtReservations {
    fn from(c: responses::FundpsbtReservations) -> Self {
        Self {
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
            vout: c.vout, // Rule #2 for type u32
            was_reserved: c.was_reserved, // Rule #2 for type boolean
            reserved: c.reserved, // Rule #2 for type boolean
            reserved_to_block: c.reserved_to_block, // Rule #2 for type u32
        }
    }
}

#[allow(unused_variables)]
impl From<responses::FundpsbtResponse> for pb::FundpsbtResponse {
    fn from(c: responses::FundpsbtResponse) -> Self {
        Self {
            psbt: c.psbt, // Rule #2 for type string
            feerate_per_kw: c.feerate_per_kw, // Rule #2 for type u32
            estimated_final_weight: c.estimated_final_weight, // Rule #2 for type u32
            excess_msat: Some(c.excess_msat.into()), // Rule #2 for type msat
            change_outnum: c.change_outnum, // Rule #2 for type u32?
            // Field: FundPsbt.reservations[]
            reservations: c.reservations.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
        }
    }
}

#[allow(unused_variables)]
impl From<responses::SendpsbtResponse> for pb::SendpsbtResponse {
    fn from(c: responses::SendpsbtResponse) -> Self {
        Self {
            tx: hex::decode(&c.tx).unwrap(), // Rule #2 for type hex
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
        }
    }
}

#[allow(unused_variables)]
impl From<responses::SignpsbtResponse> for pb::SignpsbtResponse {
    fn from(c: responses::SignpsbtResponse) -> Self {
        Self {
            signed_psbt: c.signed_psbt, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<responses::UtxopsbtReservations> for pb::UtxopsbtReservations {
    fn from(c: responses::UtxopsbtReservations) -> Self {
        Self {
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
            vout: c.vout, // Rule #2 for type u32
            was_reserved: c.was_reserved, // Rule #2 for type boolean
            reserved: c.reserved, // Rule #2 for type boolean
            reserved_to_block: c.reserved_to_block, // Rule #2 for type u32
        }
    }
}

#[allow(unused_variables)]
impl From<responses::UtxopsbtResponse> for pb::UtxopsbtResponse {
    fn from(c: responses::UtxopsbtResponse) -> Self {
        Self {
            psbt: c.psbt, // Rule #2 for type string
            feerate_per_kw: c.feerate_per_kw, // Rule #2 for type u32
            estimated_final_weight: c.estimated_final_weight, // Rule #2 for type u32
            excess_msat: Some(c.excess_msat.into()), // Rule #2 for type msat
            change_outnum: c.change_outnum, // Rule #2 for type u32?
            // Field: UtxoPsbt.reservations[]
            reservations: c.reservations.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
        }
    }
}

#[allow(unused_variables)]
impl From<responses::TxdiscardResponse> for pb::TxdiscardResponse {
    fn from(c: responses::TxdiscardResponse) -> Self {
        Self {
            unsigned_tx: hex::decode(&c.unsigned_tx).unwrap(), // Rule #2 for type hex
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
        }
    }
}

#[allow(unused_variables)]
impl From<responses::TxprepareResponse> for pb::TxprepareResponse {
    fn from(c: responses::TxprepareResponse) -> Self {
        Self {
            psbt: c.psbt, // Rule #2 for type string
            unsigned_tx: hex::decode(&c.unsigned_tx).unwrap(), // Rule #2 for type hex
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
        }
    }
}

#[allow(unused_variables)]
impl From<responses::TxsendResponse> for pb::TxsendResponse {
    fn from(c: responses::TxsendResponse) -> Self {
        Self {
            psbt: c.psbt, // Rule #2 for type string
            tx: hex::decode(&c.tx).unwrap(), // Rule #2 for type hex
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeerchannelsChannelsFeerate> for pb::ListpeerchannelsChannelsFeerate {
    fn from(c: responses::ListpeerchannelsChannelsFeerate) -> Self {
        Self {
            perkw: c.perkw, // Rule #2 for type u32?
            perkb: c.perkb, // Rule #2 for type u32?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeerchannelsChannelsInflight> for pb::ListpeerchannelsChannelsInflight {
    fn from(c: responses::ListpeerchannelsChannelsInflight) -> Self {
        Self {
            funding_txid: c.funding_txid.map(|v| hex::decode(v).unwrap()), // Rule #2 for type txid?
            funding_outnum: c.funding_outnum, // Rule #2 for type u32?
            feerate: c.feerate, // Rule #2 for type string?
            total_funding_msat: c.total_funding_msat.map(|f| f.into()), // Rule #2 for type msat?
            our_funding_msat: c.our_funding_msat.map(|f| f.into()), // Rule #2 for type msat?
            scratch_txid: c.scratch_txid.map(|v| hex::decode(v).unwrap()), // Rule #2 for type txid?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeerchannelsChannelsFunding> for pb::ListpeerchannelsChannelsFunding {
    fn from(c: responses::ListpeerchannelsChannelsFunding) -> Self {
        Self {
            pushed_msat: c.pushed_msat.map(|f| f.into()), // Rule #2 for type msat?
            local_funds_msat: c.local_funds_msat.map(|f| f.into()), // Rule #2 for type msat?
            remote_funds_msat: c.remote_funds_msat.map(|f| f.into()), // Rule #2 for type msat?
            fee_paid_msat: c.fee_paid_msat.map(|f| f.into()), // Rule #2 for type msat?
            fee_rcvd_msat: c.fee_rcvd_msat.map(|f| f.into()), // Rule #2 for type msat?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeerchannelsChannelsAlias> for pb::ListpeerchannelsChannelsAlias {
    fn from(c: responses::ListpeerchannelsChannelsAlias) -> Self {
        Self {
            local: c.local.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
            remote: c.remote.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeerchannelsChannelsHtlcs> for pb::ListpeerchannelsChannelsHtlcs {
    fn from(c: responses::ListpeerchannelsChannelsHtlcs) -> Self {
        Self {
            direction: c.direction.map(|v| v as i32),
            id: c.id, // Rule #2 for type u64?
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            expiry: c.expiry, // Rule #2 for type u32?
            payment_hash: c.payment_hash.map(|v| v.to_vec()), // Rule #2 for type hash?
            local_trimmed: c.local_trimmed, // Rule #2 for type boolean?
            status: c.status, // Rule #2 for type string?
            state: c.state.map(|v| v as i32),
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeerchannelsChannels> for pb::ListpeerchannelsChannels {
    fn from(c: responses::ListpeerchannelsChannels) -> Self {
        Self {
            peer_id: c.peer_id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            peer_connected: c.peer_connected, // Rule #2 for type boolean?
            state: c.state.map(|v| v as i32),
            scratch_txid: c.scratch_txid.map(|v| hex::decode(v).unwrap()), // Rule #2 for type txid?
            feerate: c.feerate.map(|v| v.into()),
            owner: c.owner, // Rule #2 for type string?
            short_channel_id: c.short_channel_id.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
            channel_id: c.channel_id.map(|v| v.to_vec()), // Rule #2 for type hash?
            funding_txid: c.funding_txid.map(|v| hex::decode(v).unwrap()), // Rule #2 for type txid?
            funding_outnum: c.funding_outnum, // Rule #2 for type u32?
            initial_feerate: c.initial_feerate, // Rule #2 for type string?
            last_feerate: c.last_feerate, // Rule #2 for type string?
            next_feerate: c.next_feerate, // Rule #2 for type string?
            next_fee_step: c.next_fee_step, // Rule #2 for type u32?
            // Field: ListPeerChannels.channels[].inflight[]
            inflight: c.inflight.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            close_to: c.close_to.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            private: c.private, // Rule #2 for type boolean?
            opener: c.opener.map(|v| v as i32),
            closer: c.closer.map(|v| v as i32),
            funding: c.funding.map(|v| v.into()),
            to_us_msat: c.to_us_msat.map(|f| f.into()), // Rule #2 for type msat?
            min_to_us_msat: c.min_to_us_msat.map(|f| f.into()), // Rule #2 for type msat?
            max_to_us_msat: c.max_to_us_msat.map(|f| f.into()), // Rule #2 for type msat?
            total_msat: c.total_msat.map(|f| f.into()), // Rule #2 for type msat?
            fee_base_msat: c.fee_base_msat.map(|f| f.into()), // Rule #2 for type msat?
            fee_proportional_millionths: c.fee_proportional_millionths, // Rule #2 for type u32?
            dust_limit_msat: c.dust_limit_msat.map(|f| f.into()), // Rule #2 for type msat?
            max_total_htlc_in_msat: c.max_total_htlc_in_msat.map(|f| f.into()), // Rule #2 for type msat?
            their_reserve_msat: c.their_reserve_msat.map(|f| f.into()), // Rule #2 for type msat?
            our_reserve_msat: c.our_reserve_msat.map(|f| f.into()), // Rule #2 for type msat?
            spendable_msat: c.spendable_msat.map(|f| f.into()), // Rule #2 for type msat?
            receivable_msat: c.receivable_msat.map(|f| f.into()), // Rule #2 for type msat?
            minimum_htlc_in_msat: c.minimum_htlc_in_msat.map(|f| f.into()), // Rule #2 for type msat?
            minimum_htlc_out_msat: c.minimum_htlc_out_msat.map(|f| f.into()), // Rule #2 for type msat?
            maximum_htlc_out_msat: c.maximum_htlc_out_msat.map(|f| f.into()), // Rule #2 for type msat?
            their_to_self_delay: c.their_to_self_delay, // Rule #2 for type u32?
            our_to_self_delay: c.our_to_self_delay, // Rule #2 for type u32?
            max_accepted_htlcs: c.max_accepted_htlcs, // Rule #2 for type u32?
            alias: c.alias.map(|v| v.into()),
            // Field: ListPeerChannels.channels[].status[]
            status: c.status.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            in_payments_offered: c.in_payments_offered, // Rule #2 for type u64?
            in_offered_msat: c.in_offered_msat.map(|f| f.into()), // Rule #2 for type msat?
            in_payments_fulfilled: c.in_payments_fulfilled, // Rule #2 for type u64?
            in_fulfilled_msat: c.in_fulfilled_msat.map(|f| f.into()), // Rule #2 for type msat?
            out_payments_offered: c.out_payments_offered, // Rule #2 for type u64?
            out_offered_msat: c.out_offered_msat.map(|f| f.into()), // Rule #2 for type msat?
            out_payments_fulfilled: c.out_payments_fulfilled, // Rule #2 for type u64?
            out_fulfilled_msat: c.out_fulfilled_msat.map(|f| f.into()), // Rule #2 for type msat?
            // Field: ListPeerChannels.channels[].htlcs[]
            htlcs: c.htlcs.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            close_to_addr: c.close_to_addr, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpeerchannelsResponse> for pb::ListpeerchannelsResponse {
    fn from(c: responses::ListpeerchannelsResponse) -> Self {
        Self {
            // Field: ListPeerChannels.channels[]
            channels: c.channels.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListclosedchannelsClosedchannelsAlias> for pb::ListclosedchannelsClosedchannelsAlias {
    fn from(c: responses::ListclosedchannelsClosedchannelsAlias) -> Self {
        Self {
            local: c.local.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
            remote: c.remote.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListclosedchannelsClosedchannels> for pb::ListclosedchannelsClosedchannels {
    fn from(c: responses::ListclosedchannelsClosedchannels) -> Self {
        Self {
            peer_id: c.peer_id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            channel_id: c.channel_id.to_vec(), // Rule #2 for type hash
            short_channel_id: c.short_channel_id.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
            alias: c.alias.map(|v| v.into()),
            opener: c.opener as i32,
            closer: c.closer.map(|v| v as i32),
            private: c.private, // Rule #2 for type boolean
            total_local_commitments: c.total_local_commitments, // Rule #2 for type u64
            total_remote_commitments: c.total_remote_commitments, // Rule #2 for type u64
            total_htlcs_sent: c.total_htlcs_sent, // Rule #2 for type u64
            funding_txid: hex::decode(&c.funding_txid).unwrap(), // Rule #2 for type txid
            funding_outnum: c.funding_outnum, // Rule #2 for type u32
            leased: c.leased, // Rule #2 for type boolean
            funding_fee_paid_msat: c.funding_fee_paid_msat.map(|f| f.into()), // Rule #2 for type msat?
            funding_fee_rcvd_msat: c.funding_fee_rcvd_msat.map(|f| f.into()), // Rule #2 for type msat?
            funding_pushed_msat: c.funding_pushed_msat.map(|f| f.into()), // Rule #2 for type msat?
            total_msat: Some(c.total_msat.into()), // Rule #2 for type msat
            final_to_us_msat: Some(c.final_to_us_msat.into()), // Rule #2 for type msat
            min_to_us_msat: Some(c.min_to_us_msat.into()), // Rule #2 for type msat
            max_to_us_msat: Some(c.max_to_us_msat.into()), // Rule #2 for type msat
            last_commitment_txid: c.last_commitment_txid.map(|v| v.to_vec()), // Rule #2 for type hash?
            last_commitment_fee_msat: c.last_commitment_fee_msat.map(|f| f.into()), // Rule #2 for type msat?
            close_cause: c.close_cause as i32,
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListclosedchannelsResponse> for pb::ListclosedchannelsResponse {
    fn from(c: responses::ListclosedchannelsResponse) -> Self {
        Self {
            // Field: ListClosedChannels.closedchannels[]
            closedchannels: c.closedchannels.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListclosedchannelsClosedchannels
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DecodepayFallbacks> for pb::DecodepayFallbacks {
    fn from(c: responses::DecodepayFallbacks) -> Self {
        Self {
            item_type: c.item_type as i32,
            addr: c.addr, // Rule #2 for type string?
            hex: hex::decode(&c.hex).unwrap(), // Rule #2 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DecodepayExtra> for pb::DecodepayExtra {
    fn from(c: responses::DecodepayExtra) -> Self {
        Self {
            tag: c.tag, // Rule #2 for type string
            data: c.data, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DecodepayResponse> for pb::DecodepayResponse {
    fn from(c: responses::DecodepayResponse) -> Self {
        Self {
            currency: c.currency, // Rule #2 for type string
            created_at: c.created_at, // Rule #2 for type u64
            expiry: c.expiry, // Rule #2 for type u64
            payee: c.payee.serialize().to_vec(), // Rule #2 for type pubkey
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            signature: c.signature, // Rule #2 for type signature
            description: c.description, // Rule #2 for type string?
            description_hash: c.description_hash.map(|v| v.to_vec()), // Rule #2 for type hash?
            min_final_cltv_expiry: c.min_final_cltv_expiry, // Rule #2 for type u32
            payment_secret: c.payment_secret.map(|v| v.to_vec()), // Rule #2 for type hash?
            features: c.features.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            payment_metadata: c.payment_metadata.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            // Field: DecodePay.fallbacks[]
            fallbacks: c.fallbacks.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            // Field: DecodePay.extra[]
            extra: c.extra.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DecodeOffer_paths> for pb::DecodeOfferPaths {
    fn from(c: responses::DecodeOffer_paths) -> Self {
        Self {
            first_node_id: c.first_node_id.serialize().to_vec(), // Rule #2 for type pubkey
            blinding: c.blinding.serialize().to_vec(), // Rule #2 for type pubkey
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DecodeInvoice_fallbacks> for pb::DecodeInvoiceFallbacks {
    fn from(c: responses::DecodeInvoice_fallbacks) -> Self {
        Self {
            version: c.version.into(), // Rule #2 for type u8
            hex: hex::decode(&c.hex).unwrap(), // Rule #2 for type hex
            address: c.address, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DecodeFallbacks> for pb::DecodeFallbacks {
    fn from(c: responses::DecodeFallbacks) -> Self {
        Self {
            warning_invoice_fallbacks_version_invalid: c.warning_invoice_fallbacks_version_invalid, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DecodeExtra> for pb::DecodeExtra {
    fn from(c: responses::DecodeExtra) -> Self {
        Self {
            tag: c.tag, // Rule #2 for type string
            data: c.data, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DecodeRestrictions> for pb::DecodeRestrictions {
    fn from(c: responses::DecodeRestrictions) -> Self {
        Self {
            // Field: Decode.restrictions[].alternatives[]
            alternatives: c.alternatives.into_iter().map(|i| i.into()).collect(), // Rule #3 for type string
            summary: c.summary, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DecodeResponse> for pb::DecodeResponse {
    fn from(c: responses::DecodeResponse) -> Self {
        Self {
            item_type: c.item_type as i32,
            valid: c.valid, // Rule #2 for type boolean
            offer_id: c.offer_id.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            // Field: Decode.offer_chains[]
            offer_chains: c.offer_chains.map(|arr| arr.into_iter().map(|i| i.to_vec()).collect()).unwrap_or(vec![]), // Rule #3
            offer_metadata: c.offer_metadata.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            offer_currency: c.offer_currency, // Rule #2 for type string?
            warning_unknown_offer_currency: c.warning_unknown_offer_currency, // Rule #2 for type string?
            currency_minor_unit: c.currency_minor_unit, // Rule #2 for type u32?
            offer_amount: c.offer_amount, // Rule #2 for type u64?
            offer_amount_msat: c.offer_amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            offer_description: c.offer_description, // Rule #2 for type string?
            offer_issuer: c.offer_issuer, // Rule #2 for type string?
            offer_features: c.offer_features.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            offer_absolute_expiry: c.offer_absolute_expiry, // Rule #2 for type u64?
            offer_quantity_max: c.offer_quantity_max, // Rule #2 for type u64?
            // Field: Decode.offer_paths[]
            offer_paths: c.offer_paths.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            offer_node_id: c.offer_node_id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            warning_missing_offer_node_id: c.warning_missing_offer_node_id, // Rule #2 for type string?
            warning_invalid_offer_description: c.warning_invalid_offer_description, // Rule #2 for type string?
            warning_missing_offer_description: c.warning_missing_offer_description, // Rule #2 for type string?
            warning_invalid_offer_currency: c.warning_invalid_offer_currency, // Rule #2 for type string?
            warning_invalid_offer_issuer: c.warning_invalid_offer_issuer, // Rule #2 for type string?
            invreq_metadata: c.invreq_metadata.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            invreq_payer_id: c.invreq_payer_id.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            invreq_chain: c.invreq_chain.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            invreq_amount_msat: c.invreq_amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            invreq_features: c.invreq_features.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            invreq_quantity: c.invreq_quantity, // Rule #2 for type u64?
            invreq_payer_note: c.invreq_payer_note, // Rule #2 for type string?
            invreq_recurrence_counter: c.invreq_recurrence_counter, // Rule #2 for type u32?
            invreq_recurrence_start: c.invreq_recurrence_start, // Rule #2 for type u32?
            warning_missing_invreq_metadata: c.warning_missing_invreq_metadata, // Rule #2 for type string?
            warning_missing_invreq_payer_id: c.warning_missing_invreq_payer_id, // Rule #2 for type string?
            warning_invalid_invreq_payer_note: c.warning_invalid_invreq_payer_note, // Rule #2 for type string?
            warning_missing_invoice_request_signature: c.warning_missing_invoice_request_signature, // Rule #2 for type string?
            warning_invalid_invoice_request_signature: c.warning_invalid_invoice_request_signature, // Rule #2 for type string?
            invoice_created_at: c.invoice_created_at, // Rule #2 for type u64?
            invoice_relative_expiry: c.invoice_relative_expiry, // Rule #2 for type u32?
            invoice_payment_hash: c.invoice_payment_hash.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            invoice_amount_msat: c.invoice_amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            // Field: Decode.invoice_fallbacks[]
            invoice_fallbacks: c.invoice_fallbacks.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            invoice_features: c.invoice_features.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            invoice_node_id: c.invoice_node_id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            invoice_recurrence_basetime: c.invoice_recurrence_basetime, // Rule #2 for type u64?
            warning_missing_invoice_paths: c.warning_missing_invoice_paths, // Rule #2 for type string?
            warning_missing_invoice_blindedpay: c.warning_missing_invoice_blindedpay, // Rule #2 for type string?
            warning_missing_invoice_created_at: c.warning_missing_invoice_created_at, // Rule #2 for type string?
            warning_missing_invoice_payment_hash: c.warning_missing_invoice_payment_hash, // Rule #2 for type string?
            warning_missing_invoice_amount: c.warning_missing_invoice_amount, // Rule #2 for type string?
            warning_missing_invoice_recurrence_basetime: c.warning_missing_invoice_recurrence_basetime, // Rule #2 for type string?
            warning_missing_invoice_node_id: c.warning_missing_invoice_node_id, // Rule #2 for type string?
            warning_missing_invoice_signature: c.warning_missing_invoice_signature, // Rule #2 for type string?
            warning_invalid_invoice_signature: c.warning_invalid_invoice_signature, // Rule #2 for type string?
            // Field: Decode.fallbacks[]
            fallbacks: c.fallbacks.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            created_at: c.created_at, // Rule #2 for type u64?
            expiry: c.expiry, // Rule #2 for type u64?
            payee: c.payee.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            payment_hash: c.payment_hash.map(|v| v.to_vec()), // Rule #2 for type hash?
            description_hash: c.description_hash.map(|v| v.to_vec()), // Rule #2 for type hash?
            min_final_cltv_expiry: c.min_final_cltv_expiry, // Rule #2 for type u32?
            payment_secret: c.payment_secret.map(|v| v.to_vec()), // Rule #2 for type secret?
            payment_metadata: c.payment_metadata.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            // Field: Decode.extra[]
            extra: c.extra.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            unique_id: c.unique_id, // Rule #2 for type string?
            version: c.version, // Rule #2 for type string?
            string: c.string, // Rule #2 for type string?
            // Field: Decode.restrictions[]
            restrictions: c.restrictions.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            warning_rune_invalid_utf8: c.warning_rune_invalid_utf8, // Rule #2 for type string?
            hex: c.hex.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::DisconnectResponse> for pb::DisconnectResponse {
    fn from(c: responses::DisconnectResponse) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<responses::FeeratesPerkbEstimates> for pb::FeeratesPerkbEstimates {
    fn from(c: responses::FeeratesPerkbEstimates) -> Self {
        Self {
            blockcount: c.blockcount, // Rule #2 for type u32?
            feerate: c.feerate, // Rule #2 for type u32?
            smoothed_feerate: c.smoothed_feerate, // Rule #2 for type u32?
        }
    }
}

#[allow(unused_variables,deprecated)]
impl From<responses::FeeratesPerkb> for pb::FeeratesPerkb {
    fn from(c: responses::FeeratesPerkb) -> Self {
        Self {
            min_acceptable: c.min_acceptable, // Rule #2 for type u32
            max_acceptable: c.max_acceptable, // Rule #2 for type u32
            floor: c.floor, // Rule #2 for type u32?
            // Field: Feerates.perkb.estimates[]
            estimates: c.estimates.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            opening: c.opening, // Rule #2 for type u32?
            mutual_close: c.mutual_close, // Rule #2 for type u32?
            unilateral_close: c.unilateral_close, // Rule #2 for type u32?
            unilateral_anchor_close: c.unilateral_anchor_close, // Rule #2 for type u32?
            #[allow(deprecated)]
            delayed_to_us: c.delayed_to_us, // Rule #2 for type u32?
            #[allow(deprecated)]
            htlc_resolution: c.htlc_resolution, // Rule #2 for type u32?
            penalty: c.penalty, // Rule #2 for type u32?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::FeeratesPerkwEstimates> for pb::FeeratesPerkwEstimates {
    fn from(c: responses::FeeratesPerkwEstimates) -> Self {
        Self {
            blockcount: c.blockcount, // Rule #2 for type u32?
            feerate: c.feerate, // Rule #2 for type u32?
            smoothed_feerate: c.smoothed_feerate, // Rule #2 for type u32?
        }
    }
}

#[allow(unused_variables,deprecated)]
impl From<responses::FeeratesPerkw> for pb::FeeratesPerkw {
    fn from(c: responses::FeeratesPerkw) -> Self {
        Self {
            min_acceptable: c.min_acceptable, // Rule #2 for type u32
            max_acceptable: c.max_acceptable, // Rule #2 for type u32
            floor: c.floor, // Rule #2 for type u32?
            // Field: Feerates.perkw.estimates[]
            estimates: c.estimates.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            opening: c.opening, // Rule #2 for type u32?
            mutual_close: c.mutual_close, // Rule #2 for type u32?
            unilateral_close: c.unilateral_close, // Rule #2 for type u32?
            unilateral_anchor_close: c.unilateral_anchor_close, // Rule #2 for type u32?
            #[allow(deprecated)]
            delayed_to_us: c.delayed_to_us, // Rule #2 for type u32?
            #[allow(deprecated)]
            htlc_resolution: c.htlc_resolution, // Rule #2 for type u32?
            penalty: c.penalty, // Rule #2 for type u32?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::FeeratesOnchain_fee_estimates> for pb::FeeratesOnchainFeeEstimates {
    fn from(c: responses::FeeratesOnchain_fee_estimates) -> Self {
        Self {
            opening_channel_satoshis: c.opening_channel_satoshis, // Rule #2 for type u64
            mutual_close_satoshis: c.mutual_close_satoshis, // Rule #2 for type u64
            unilateral_close_satoshis: c.unilateral_close_satoshis, // Rule #2 for type u64
            unilateral_close_nonanchor_satoshis: c.unilateral_close_nonanchor_satoshis, // Rule #2 for type u64?
            htlc_timeout_satoshis: c.htlc_timeout_satoshis, // Rule #2 for type u64
            htlc_success_satoshis: c.htlc_success_satoshis, // Rule #2 for type u64
        }
    }
}

#[allow(unused_variables)]
impl From<responses::FeeratesResponse> for pb::FeeratesResponse {
    fn from(c: responses::FeeratesResponse) -> Self {
        Self {
            warning_missing_feerates: c.warning_missing_feerates, // Rule #2 for type string?
            perkb: c.perkb.map(|v| v.into()),
            perkw: c.perkw.map(|v| v.into()),
            onchain_fee_estimates: c.onchain_fee_estimates.map(|v| v.into()),
        }
    }
}

#[allow(unused_variables)]
impl From<responses::FundchannelResponse> for pb::FundchannelResponse {
    fn from(c: responses::FundchannelResponse) -> Self {
        Self {
            tx: hex::decode(&c.tx).unwrap(), // Rule #2 for type hex
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
            outnum: c.outnum, // Rule #2 for type u32
            channel_id: hex::decode(&c.channel_id).unwrap(), // Rule #2 for type hex
            close_to: c.close_to.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            mindepth: c.mindepth, // Rule #2 for type u32?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::GetrouteRoute> for pb::GetrouteRoute {
    fn from(c: responses::GetrouteRoute) -> Self {
        Self {
            id: c.id.serialize().to_vec(), // Rule #2 for type pubkey
            channel: c.channel.to_string(), // Rule #2 for type short_channel_id
            direction: c.direction, // Rule #2 for type u32
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            delay: c.delay, // Rule #2 for type u32
            style: c.style as i32,
        }
    }
}

#[allow(unused_variables)]
impl From<responses::GetrouteResponse> for pb::GetrouteResponse {
    fn from(c: responses::GetrouteResponse) -> Self {
        Self {
            // Field: GetRoute.route[]
            route: c.route.into_iter().map(|i| i.into()).collect(), // Rule #3 for type GetrouteRoute
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListforwardsForwards> for pb::ListforwardsForwards {
    fn from(c: responses::ListforwardsForwards) -> Self {
        Self {
            in_channel: c.in_channel.to_string(), // Rule #2 for type short_channel_id
            in_htlc_id: c.in_htlc_id, // Rule #2 for type u64?
            in_msat: Some(c.in_msat.into()), // Rule #2 for type msat
            status: c.status as i32,
            received_time: c.received_time, // Rule #2 for type number
            out_channel: c.out_channel.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
            out_htlc_id: c.out_htlc_id, // Rule #2 for type u64?
            style: c.style.map(|v| v as i32),
            fee_msat: c.fee_msat.map(|f| f.into()), // Rule #2 for type msat?
            out_msat: c.out_msat.map(|f| f.into()), // Rule #2 for type msat?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListforwardsResponse> for pb::ListforwardsResponse {
    fn from(c: responses::ListforwardsResponse) -> Self {
        Self {
            // Field: ListForwards.forwards[]
            forwards: c.forwards.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListforwardsForwards
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpaysPays> for pb::ListpaysPays {
    fn from(c: responses::ListpaysPays) -> Self {
        Self {
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            status: c.status as i32,
            destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            created_at: c.created_at, // Rule #2 for type u64
            completed_at: c.completed_at, // Rule #2 for type u64?
            label: c.label, // Rule #2 for type string?
            bolt11: c.bolt11, // Rule #2 for type string?
            description: c.description, // Rule #2 for type string?
            bolt12: c.bolt12, // Rule #2 for type string?
            preimage: c.preimage.map(|v| v.to_vec()), // Rule #2 for type secret?
            number_of_parts: c.number_of_parts, // Rule #2 for type u64?
            erroronion: c.erroronion.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::ListpaysResponse> for pb::ListpaysResponse {
    fn from(c: responses::ListpaysResponse) -> Self {
        Self {
            // Field: ListPays.pays[]
            pays: c.pays.into_iter().map(|i| i.into()).collect(), // Rule #3 for type ListpaysPays
        }
    }
}

#[allow(unused_variables)]
impl From<responses::PingResponse> for pb::PingResponse {
    fn from(c: responses::PingResponse) -> Self {
        Self {
            totlen: c.totlen.into(), // Rule #2 for type u16
        }
    }
}

#[allow(unused_variables)]
impl From<responses::SendcustommsgResponse> for pb::SendcustommsgResponse {
    fn from(c: responses::SendcustommsgResponse) -> Self {
        Self {
            status: c.status, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<responses::SetchannelChannels> for pb::SetchannelChannels {
    fn from(c: responses::SetchannelChannels) -> Self {
        Self {
            peer_id: c.peer_id.serialize().to_vec(), // Rule #2 for type pubkey
            channel_id: hex::decode(&c.channel_id).unwrap(), // Rule #2 for type hex
            short_channel_id: c.short_channel_id.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
            fee_base_msat: Some(c.fee_base_msat.into()), // Rule #2 for type msat
            fee_proportional_millionths: c.fee_proportional_millionths, // Rule #2 for type u32
            minimum_htlc_out_msat: Some(c.minimum_htlc_out_msat.into()), // Rule #2 for type msat
            warning_htlcmin_too_low: c.warning_htlcmin_too_low, // Rule #2 for type string?
            maximum_htlc_out_msat: Some(c.maximum_htlc_out_msat.into()), // Rule #2 for type msat
            warning_htlcmax_too_high: c.warning_htlcmax_too_high, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<responses::SetchannelResponse> for pb::SetchannelResponse {
    fn from(c: responses::SetchannelResponse) -> Self {
        Self {
            // Field: SetChannel.channels[]
            channels: c.channels.into_iter().map(|i| i.into()).collect(), // Rule #3 for type SetchannelChannels
        }
    }
}

#[allow(unused_variables)]
impl From<responses::SigninvoiceResponse> for pb::SigninvoiceResponse {
    fn from(c: responses::SigninvoiceResponse) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<responses::SignmessageResponse> for pb::SignmessageResponse {
    fn from(c: responses::SignmessageResponse) -> Self {
        Self {
            signature: hex::decode(&c.signature).unwrap(), // Rule #2 for type hex
            recid: hex::decode(&c.recid).unwrap(), // Rule #2 for type hex
            zbase: c.zbase, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<responses::StopResponse> for pb::StopResponse {
    fn from(c: responses::StopResponse) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<responses::PreapprovekeysendResponse> for pb::PreapprovekeysendResponse {
    fn from(c: responses::PreapprovekeysendResponse) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<responses::PreapproveinvoiceResponse> for pb::PreapproveinvoiceResponse {
    fn from(c: responses::PreapproveinvoiceResponse) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<requests::GetinfoRequest> for pb::GetinfoRequest {
    fn from(c: requests::GetinfoRequest) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListpeersRequest> for pb::ListpeersRequest {
    fn from(c: requests::ListpeersRequest) -> Self {
        Self {
            id: c.id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            level: c.level, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListfundsRequest> for pb::ListfundsRequest {
    fn from(c: requests::ListfundsRequest) -> Self {
        Self {
            spent: c.spent, // Rule #2 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::SendpayRoute> for pb::SendpayRoute {
    fn from(c: requests::SendpayRoute) -> Self {
        Self {
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            id: c.id.serialize().to_vec(), // Rule #2 for type pubkey
            delay: c.delay.into(), // Rule #2 for type u16
            channel: c.channel.to_string(), // Rule #2 for type short_channel_id
        }
    }
}

#[allow(unused_variables)]
impl From<requests::SendpayRequest> for pb::SendpayRequest {
    fn from(c: requests::SendpayRequest) -> Self {
        Self {
            // Field: SendPay.route[]
            route: c.route.into_iter().map(|i| i.into()).collect(), // Rule #3 for type SendpayRoute
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            label: c.label, // Rule #2 for type string?
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            bolt11: c.bolt11, // Rule #2 for type string?
            payment_secret: c.payment_secret.map(|v| v.to_vec()), // Rule #2 for type secret?
            partid: c.partid.map(|v| v.into()), // Rule #2 for type u16?
            localinvreqid: c.localinvreqid.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            groupid: c.groupid, // Rule #2 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListchannelsRequest> for pb::ListchannelsRequest {
    fn from(c: requests::ListchannelsRequest) -> Self {
        Self {
            short_channel_id: c.short_channel_id.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
            source: c.source.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::AddgossipRequest> for pb::AddgossipRequest {
    fn from(c: requests::AddgossipRequest) -> Self {
        Self {
            message: hex::decode(&c.message).unwrap(), // Rule #2 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<requests::AutocleaninvoiceRequest> for pb::AutocleaninvoiceRequest {
    fn from(c: requests::AutocleaninvoiceRequest) -> Self {
        Self {
            expired_by: c.expired_by, // Rule #2 for type u64?
            cycle_seconds: c.cycle_seconds, // Rule #2 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::CheckmessageRequest> for pb::CheckmessageRequest {
    fn from(c: requests::CheckmessageRequest) -> Self {
        Self {
            message: c.message, // Rule #2 for type string
            zbase: c.zbase, // Rule #2 for type string
            pubkey: c.pubkey.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::CloseRequest> for pb::CloseRequest {
    fn from(c: requests::CloseRequest) -> Self {
        Self {
            id: c.id, // Rule #2 for type string
            unilateraltimeout: c.unilateraltimeout, // Rule #2 for type u32?
            destination: c.destination, // Rule #2 for type string?
            fee_negotiation_step: c.fee_negotiation_step, // Rule #2 for type string?
            wrong_funding: c.wrong_funding.map(|o|o.into()), // Rule #2 for type outpoint?
            force_lease_closed: c.force_lease_closed, // Rule #2 for type boolean?
            // Field: Close.feerange[]
            feerange: c.feerange.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ConnectRequest> for pb::ConnectRequest {
    fn from(c: requests::ConnectRequest) -> Self {
        Self {
            id: c.id, // Rule #2 for type string
            host: c.host, // Rule #2 for type string?
            port: c.port.map(|v| v.into()), // Rule #2 for type u16?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::CreateinvoiceRequest> for pb::CreateinvoiceRequest {
    fn from(c: requests::CreateinvoiceRequest) -> Self {
        Self {
            invstring: c.invstring, // Rule #2 for type string
            label: c.label, // Rule #2 for type string
            preimage: hex::decode(&c.preimage).unwrap(), // Rule #2 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<requests::DatastoreRequest> for pb::DatastoreRequest {
    fn from(c: requests::DatastoreRequest) -> Self {
        Self {
            // Field: Datastore.key
            key: c.key.into_iter().map(|i| i.into()).collect(), // Rule #3 for type string
            string: c.string, // Rule #2 for type string?
            hex: c.hex.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            mode: c.mode.map(|v| v as i32),
            generation: c.generation, // Rule #2 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::CreateonionHops> for pb::CreateonionHops {
    fn from(c: requests::CreateonionHops) -> Self {
        Self {
            pubkey: c.pubkey.serialize().to_vec(), // Rule #2 for type pubkey
            payload: hex::decode(&c.payload).unwrap(), // Rule #2 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<requests::CreateonionRequest> for pb::CreateonionRequest {
    fn from(c: requests::CreateonionRequest) -> Self {
        Self {
            // Field: CreateOnion.hops[]
            hops: c.hops.into_iter().map(|i| i.into()).collect(), // Rule #3 for type CreateonionHops
            assocdata: hex::decode(&c.assocdata).unwrap(), // Rule #2 for type hex
            session_key: c.session_key.map(|v| v.to_vec()), // Rule #2 for type secret?
            onion_size: c.onion_size.map(|v| v.into()), // Rule #2 for type u16?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::DeldatastoreRequest> for pb::DeldatastoreRequest {
    fn from(c: requests::DeldatastoreRequest) -> Self {
        Self {
            // Field: DelDatastore.key
            key: c.key.into_iter().map(|i| i.into()).collect(), // Rule #3 for type string
            generation: c.generation, // Rule #2 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::DelexpiredinvoiceRequest> for pb::DelexpiredinvoiceRequest {
    fn from(c: requests::DelexpiredinvoiceRequest) -> Self {
        Self {
            maxexpirytime: c.maxexpirytime, // Rule #2 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::DelinvoiceRequest> for pb::DelinvoiceRequest {
    fn from(c: requests::DelinvoiceRequest) -> Self {
        Self {
            label: c.label, // Rule #2 for type string
            status: c.status as i32,
            desconly: c.desconly, // Rule #2 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::InvoiceRequest> for pb::InvoiceRequest {
    fn from(c: requests::InvoiceRequest) -> Self {
        Self {
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat_or_any
            description: c.description, // Rule #2 for type string
            label: c.label, // Rule #2 for type string
            expiry: c.expiry, // Rule #2 for type u64?
            // Field: Invoice.fallbacks[]
            fallbacks: c.fallbacks.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            preimage: c.preimage.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            cltv: c.cltv, // Rule #2 for type u32?
            deschashonly: c.deschashonly, // Rule #2 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListdatastoreRequest> for pb::ListdatastoreRequest {
    fn from(c: requests::ListdatastoreRequest) -> Self {
        Self {
            // Field: ListDatastore.key
            key: c.key.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListinvoicesRequest> for pb::ListinvoicesRequest {
    fn from(c: requests::ListinvoicesRequest) -> Self {
        Self {
            label: c.label, // Rule #2 for type string?
            invstring: c.invstring, // Rule #2 for type string?
            payment_hash: c.payment_hash.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            offer_id: c.offer_id, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::SendonionFirst_hop> for pb::SendonionFirstHop {
    fn from(c: requests::SendonionFirst_hop) -> Self {
        Self {
            id: c.id.serialize().to_vec(), // Rule #2 for type pubkey
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            delay: c.delay.into(), // Rule #2 for type u16
        }
    }
}

#[allow(unused_variables)]
impl From<requests::SendonionRequest> for pb::SendonionRequest {
    fn from(c: requests::SendonionRequest) -> Self {
        Self {
            onion: hex::decode(&c.onion).unwrap(), // Rule #2 for type hex
            first_hop: Some(c.first_hop.into()),
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            label: c.label, // Rule #2 for type string?
            // Field: SendOnion.shared_secrets[]
            shared_secrets: c.shared_secrets.map(|arr| arr.into_iter().map(|i| i.to_vec()).collect()).unwrap_or(vec![]), // Rule #3
            partid: c.partid.map(|v| v.into()), // Rule #2 for type u16?
            bolt11: c.bolt11, // Rule #2 for type string?
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            localinvreqid: c.localinvreqid.map(|v| v.to_vec()), // Rule #2 for type hash?
            groupid: c.groupid, // Rule #2 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListsendpaysRequest> for pb::ListsendpaysRequest {
    fn from(c: requests::ListsendpaysRequest) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #2 for type string?
            payment_hash: c.payment_hash.map(|v| v.to_vec()), // Rule #2 for type hash?
            status: c.status.map(|v| v as i32),
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListtransactionsRequest> for pb::ListtransactionsRequest {
    fn from(c: requests::ListtransactionsRequest) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<requests::PayRequest> for pb::PayRequest {
    fn from(c: requests::PayRequest) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #2 for type string
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
            label: c.label, // Rule #2 for type string?
            riskfactor: c.riskfactor, // Rule #2 for type number?
            maxfeepercent: c.maxfeepercent, // Rule #2 for type number?
            retry_for: c.retry_for.map(|v| v.into()), // Rule #2 for type u16?
            maxdelay: c.maxdelay.map(|v| v.into()), // Rule #2 for type u16?
            exemptfee: c.exemptfee.map(|f| f.into()), // Rule #2 for type msat?
            localinvreqid: c.localinvreqid.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            // Field: Pay.exclude
            exclude: c.exclude.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            maxfee: c.maxfee.map(|f| f.into()), // Rule #2 for type msat?
            description: c.description, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListnodesRequest> for pb::ListnodesRequest {
    fn from(c: requests::ListnodesRequest) -> Self {
        Self {
            id: c.id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::WaitanyinvoiceRequest> for pb::WaitanyinvoiceRequest {
    fn from(c: requests::WaitanyinvoiceRequest) -> Self {
        Self {
            lastpay_index: c.lastpay_index, // Rule #2 for type u64?
            timeout: c.timeout, // Rule #2 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::WaitinvoiceRequest> for pb::WaitinvoiceRequest {
    fn from(c: requests::WaitinvoiceRequest) -> Self {
        Self {
            label: c.label, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<requests::WaitsendpayRequest> for pb::WaitsendpayRequest {
    fn from(c: requests::WaitsendpayRequest) -> Self {
        Self {
            payment_hash: c.payment_hash.to_vec(), // Rule #2 for type hash
            timeout: c.timeout, // Rule #2 for type u32?
            partid: c.partid, // Rule #2 for type u64?
            groupid: c.groupid, // Rule #2 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::NewaddrRequest> for pb::NewaddrRequest {
    fn from(c: requests::NewaddrRequest) -> Self {
        Self {
            addresstype: c.addresstype.map(|v| v as i32),
        }
    }
}

#[allow(unused_variables)]
impl From<requests::WithdrawRequest> for pb::WithdrawRequest {
    fn from(c: requests::WithdrawRequest) -> Self {
        Self {
            destination: c.destination, // Rule #2 for type string
            satoshi: c.satoshi.map(|o|o.into()), // Rule #2 for type msat_or_all?
            feerate: c.feerate.map(|o|o.into()), // Rule #2 for type feerate?
            minconf: c.minconf.map(|v| v.into()), // Rule #2 for type u16?
            // Field: Withdraw.utxos[]
            utxos: c.utxos.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
        }
    }
}

#[allow(unused_variables)]
impl From<requests::KeysendRequest> for pb::KeysendRequest {
    fn from(c: requests::KeysendRequest) -> Self {
        Self {
            destination: c.destination.serialize().to_vec(), // Rule #2 for type pubkey
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            label: c.label, // Rule #2 for type string?
            maxfeepercent: c.maxfeepercent, // Rule #2 for type number?
            retry_for: c.retry_for, // Rule #2 for type u32?
            maxdelay: c.maxdelay, // Rule #2 for type u32?
            exemptfee: c.exemptfee.map(|f| f.into()), // Rule #2 for type msat?
            routehints: c.routehints.map(|rl| rl.into()), // Rule #2 for type RoutehintList?
            extratlvs: c.extratlvs.map(|s| s.into()), // Rule #2 for type TlvStream?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::FundpsbtRequest> for pb::FundpsbtRequest {
    fn from(c: requests::FundpsbtRequest) -> Self {
        Self {
            satoshi: Some(c.satoshi.into()), // Rule #2 for type msat_or_all
            feerate: Some(c.feerate.into()), // Rule #2 for type feerate
            startweight: c.startweight, // Rule #2 for type u32
            minconf: c.minconf, // Rule #2 for type u32?
            reserve: c.reserve, // Rule #2 for type u32?
            locktime: c.locktime, // Rule #2 for type u32?
            min_witness_weight: c.min_witness_weight, // Rule #2 for type u32?
            excess_as_change: c.excess_as_change, // Rule #2 for type boolean?
            nonwrapped: c.nonwrapped, // Rule #2 for type boolean?
            opening_anchor_channel: c.opening_anchor_channel, // Rule #2 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::SendpsbtRequest> for pb::SendpsbtRequest {
    fn from(c: requests::SendpsbtRequest) -> Self {
        Self {
            psbt: c.psbt, // Rule #2 for type string
            reserve: c.reserve, // Rule #2 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::SignpsbtRequest> for pb::SignpsbtRequest {
    fn from(c: requests::SignpsbtRequest) -> Self {
        Self {
            psbt: c.psbt, // Rule #2 for type string
            // Field: SignPsbt.signonly[]
            signonly: c.signonly.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
        }
    }
}

#[allow(unused_variables)]
impl From<requests::UtxopsbtRequest> for pb::UtxopsbtRequest {
    fn from(c: requests::UtxopsbtRequest) -> Self {
        Self {
            satoshi: Some(c.satoshi.into()), // Rule #2 for type msat
            feerate: Some(c.feerate.into()), // Rule #2 for type feerate
            startweight: c.startweight, // Rule #2 for type u32
            // Field: UtxoPsbt.utxos[]
            utxos: c.utxos.into_iter().map(|i| i.into()).collect(), // Rule #3 for type outpoint
            reserve: c.reserve, // Rule #2 for type u32?
            reservedok: c.reservedok, // Rule #2 for type boolean?
            locktime: c.locktime, // Rule #2 for type u32?
            min_witness_weight: c.min_witness_weight, // Rule #2 for type u32?
            excess_as_change: c.excess_as_change, // Rule #2 for type boolean?
            opening_anchor_channel: c.opening_anchor_channel, // Rule #2 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::TxdiscardRequest> for pb::TxdiscardRequest {
    fn from(c: requests::TxdiscardRequest) -> Self {
        Self {
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
        }
    }
}

#[allow(unused_variables)]
impl From<requests::TxprepareRequest> for pb::TxprepareRequest {
    fn from(c: requests::TxprepareRequest) -> Self {
        Self {
            // Field: TxPrepare.outputs[]
            outputs: c.outputs.into_iter().map(|i| i.into()).collect(), // Rule #3 for type outputdesc
            feerate: c.feerate.map(|o|o.into()), // Rule #2 for type feerate?
            minconf: c.minconf, // Rule #2 for type u32?
            // Field: TxPrepare.utxos[]
            utxos: c.utxos.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
        }
    }
}

#[allow(unused_variables)]
impl From<requests::TxsendRequest> for pb::TxsendRequest {
    fn from(c: requests::TxsendRequest) -> Self {
        Self {
            txid: hex::decode(&c.txid).unwrap(), // Rule #2 for type txid
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListpeerchannelsRequest> for pb::ListpeerchannelsRequest {
    fn from(c: requests::ListpeerchannelsRequest) -> Self {
        Self {
            id: c.id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListclosedchannelsRequest> for pb::ListclosedchannelsRequest {
    fn from(c: requests::ListclosedchannelsRequest) -> Self {
        Self {
            id: c.id.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::DecodepayRequest> for pb::DecodepayRequest {
    fn from(c: requests::DecodepayRequest) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #2 for type string
            description: c.description, // Rule #2 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::DecodeRequest> for pb::DecodeRequest {
    fn from(c: requests::DecodeRequest) -> Self {
        Self {
            string: c.string, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<requests::DisconnectRequest> for pb::DisconnectRequest {
    fn from(c: requests::DisconnectRequest) -> Self {
        Self {
            id: c.id.serialize().to_vec(), // Rule #2 for type pubkey
            force: c.force, // Rule #2 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::FeeratesRequest> for pb::FeeratesRequest {
    fn from(c: requests::FeeratesRequest) -> Self {
        Self {
            style: c.style as i32,
        }
    }
}

#[allow(unused_variables)]
impl From<requests::FundchannelRequest> for pb::FundchannelRequest {
    fn from(c: requests::FundchannelRequest) -> Self {
        Self {
            id: c.id.serialize().to_vec(), // Rule #2 for type pubkey
            amount: Some(c.amount.into()), // Rule #2 for type msat_or_all
            feerate: c.feerate.map(|o|o.into()), // Rule #2 for type feerate?
            announce: c.announce, // Rule #2 for type boolean?
            minconf: c.minconf, // Rule #2 for type u32?
            push_msat: c.push_msat.map(|f| f.into()), // Rule #2 for type msat?
            close_to: c.close_to, // Rule #2 for type string?
            request_amt: c.request_amt.map(|f| f.into()), // Rule #2 for type msat?
            compact_lease: c.compact_lease, // Rule #2 for type string?
            // Field: FundChannel.utxos[]
            utxos: c.utxos.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            mindepth: c.mindepth, // Rule #2 for type u32?
            reserve: c.reserve.map(|f| f.into()), // Rule #2 for type msat?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::GetrouteRequest> for pb::GetrouteRequest {
    fn from(c: requests::GetrouteRequest) -> Self {
        Self {
            id: c.id.serialize().to_vec(), // Rule #2 for type pubkey
            amount_msat: Some(c.amount_msat.into()), // Rule #2 for type msat
            riskfactor: c.riskfactor, // Rule #2 for type u64
            cltv: c.cltv, // Rule #2 for type number?
            fromid: c.fromid.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            fuzzpercent: c.fuzzpercent, // Rule #2 for type u32?
            // Field: GetRoute.exclude[]
            exclude: c.exclude.map(|arr| arr.into_iter().map(|i| i.into()).collect()).unwrap_or(vec![]), // Rule #3
            maxhops: c.maxhops, // Rule #2 for type u32?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListforwardsRequest> for pb::ListforwardsRequest {
    fn from(c: requests::ListforwardsRequest) -> Self {
        Self {
            status: c.status.map(|v| v as i32),
            in_channel: c.in_channel.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
            out_channel: c.out_channel.map(|v| v.to_string()), // Rule #2 for type short_channel_id?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::ListpaysRequest> for pb::ListpaysRequest {
    fn from(c: requests::ListpaysRequest) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #2 for type string?
            payment_hash: c.payment_hash.map(|v| v.to_vec()), // Rule #2 for type hash?
            status: c.status.map(|v| v as i32),
        }
    }
}

#[allow(unused_variables)]
impl From<requests::PingRequest> for pb::PingRequest {
    fn from(c: requests::PingRequest) -> Self {
        Self {
            id: c.id.serialize().to_vec(), // Rule #2 for type pubkey
            len: c.len.map(|v| v.into()), // Rule #2 for type u16?
            pongbytes: c.pongbytes.map(|v| v.into()), // Rule #2 for type u16?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::SendcustommsgRequest> for pb::SendcustommsgRequest {
    fn from(c: requests::SendcustommsgRequest) -> Self {
        Self {
            node_id: c.node_id.serialize().to_vec(), // Rule #2 for type pubkey
            msg: hex::decode(&c.msg).unwrap(), // Rule #2 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<requests::SetchannelRequest> for pb::SetchannelRequest {
    fn from(c: requests::SetchannelRequest) -> Self {
        Self {
            id: c.id, // Rule #2 for type string
            feebase: c.feebase.map(|f| f.into()), // Rule #2 for type msat?
            feeppm: c.feeppm, // Rule #2 for type u32?
            htlcmin: c.htlcmin.map(|f| f.into()), // Rule #2 for type msat?
            htlcmax: c.htlcmax.map(|f| f.into()), // Rule #2 for type msat?
            enforcedelay: c.enforcedelay, // Rule #2 for type u32?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::SigninvoiceRequest> for pb::SigninvoiceRequest {
    fn from(c: requests::SigninvoiceRequest) -> Self {
        Self {
            invstring: c.invstring, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<requests::SignmessageRequest> for pb::SignmessageRequest {
    fn from(c: requests::SignmessageRequest) -> Self {
        Self {
            message: c.message, // Rule #2 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<requests::StopRequest> for pb::StopRequest {
    fn from(c: requests::StopRequest) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<requests::PreapprovekeysendRequest> for pb::PreapprovekeysendRequest {
    fn from(c: requests::PreapprovekeysendRequest) -> Self {
        Self {
            destination: c.destination.map(|v| v.serialize().to_vec()), // Rule #2 for type pubkey?
            payment_hash: c.payment_hash.map(|v| hex::decode(v).unwrap()), // Rule #2 for type hex?
            amount_msat: c.amount_msat.map(|f| f.into()), // Rule #2 for type msat?
        }
    }
}

#[allow(unused_variables)]
impl From<requests::PreapproveinvoiceRequest> for pb::PreapproveinvoiceRequest {
    fn from(c: requests::PreapproveinvoiceRequest) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #2 for type string?
        }
    }
}


#[allow(unused_variables)]
impl From<pb::GetinfoRequest> for requests::GetinfoRequest {
    fn from(c: pb::GetinfoRequest) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListpeersRequest> for requests::ListpeersRequest {
    fn from(c: pb::ListpeersRequest) -> Self {
        Self {
            id: c.id.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey?
            level: c.level, // Rule #1 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListfundsRequest> for requests::ListfundsRequest {
    fn from(c: pb::ListfundsRequest) -> Self {
        Self {
            spent: c.spent, // Rule #1 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::SendpayRoute> for requests::SendpayRoute {
    fn from(c: pb::SendpayRoute) -> Self {
        Self {
            amount_msat: c.amount_msat.unwrap().into(), // Rule #1 for type msat
            id: PublicKey::from_slice(&c.id).unwrap(), // Rule #1 for type pubkey
            delay: c.delay as u16, // Rule #1 for type u16
            channel: cln_rpc::primitives::ShortChannelId::from_str(&c.channel).unwrap(), // Rule #1 for type short_channel_id
        }
    }
}

#[allow(unused_variables)]
impl From<pb::SendpayRequest> for requests::SendpayRequest {
    fn from(c: pb::SendpayRequest) -> Self {
        Self {
            route: c.route.into_iter().map(|s| s.into()).collect(), // Rule #4
            payment_hash: Sha256::from_slice(&c.payment_hash).unwrap(), // Rule #1 for type hash
            label: c.label, // Rule #1 for type string?
            amount_msat: c.amount_msat.map(|a| a.into()), // Rule #1 for type msat?
            bolt11: c.bolt11, // Rule #1 for type string?
            payment_secret: c.payment_secret.map(|v| v.try_into().unwrap()), // Rule #1 for type secret?
            partid: c.partid.map(|v| v as u16), // Rule #1 for type u16?
            localinvreqid: c.localinvreqid.map(|v| hex::encode(v)), // Rule #1 for type hex?
            groupid: c.groupid, // Rule #1 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListchannelsRequest> for requests::ListchannelsRequest {
    fn from(c: pb::ListchannelsRequest) -> Self {
        Self {
            short_channel_id: c.short_channel_id.map(|v| cln_rpc::primitives::ShortChannelId::from_str(&v).unwrap()), // Rule #1 for type short_channel_id?
            source: c.source.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey?
            destination: c.destination.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::AddgossipRequest> for requests::AddgossipRequest {
    fn from(c: pb::AddgossipRequest) -> Self {
        Self {
            message: hex::encode(&c.message), // Rule #1 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<pb::AutocleaninvoiceRequest> for requests::AutocleaninvoiceRequest {
    fn from(c: pb::AutocleaninvoiceRequest) -> Self {
        Self {
            expired_by: c.expired_by, // Rule #1 for type u64?
            cycle_seconds: c.cycle_seconds, // Rule #1 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::CheckmessageRequest> for requests::CheckmessageRequest {
    fn from(c: pb::CheckmessageRequest) -> Self {
        Self {
            message: c.message, // Rule #1 for type string
            zbase: c.zbase, // Rule #1 for type string
            pubkey: c.pubkey.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::CloseRequest> for requests::CloseRequest {
    fn from(c: pb::CloseRequest) -> Self {
        Self {
            id: c.id, // Rule #1 for type string
            unilateraltimeout: c.unilateraltimeout, // Rule #1 for type u32?
            destination: c.destination, // Rule #1 for type string?
            fee_negotiation_step: c.fee_negotiation_step, // Rule #1 for type string?
            wrong_funding: c.wrong_funding.map(|a| a.into()), // Rule #1 for type outpoint?
            force_lease_closed: c.force_lease_closed, // Rule #1 for type boolean?
            feerange: Some(c.feerange.into_iter().map(|s| s.into()).collect()), // Rule #4
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ConnectRequest> for requests::ConnectRequest {
    fn from(c: pb::ConnectRequest) -> Self {
        Self {
            id: c.id, // Rule #1 for type string
            host: c.host, // Rule #1 for type string?
            port: c.port.map(|v| v as u16), // Rule #1 for type u16?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::CreateinvoiceRequest> for requests::CreateinvoiceRequest {
    fn from(c: pb::CreateinvoiceRequest) -> Self {
        Self {
            invstring: c.invstring, // Rule #1 for type string
            label: c.label, // Rule #1 for type string
            preimage: hex::encode(&c.preimage), // Rule #1 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<pb::DatastoreRequest> for requests::DatastoreRequest {
    fn from(c: pb::DatastoreRequest) -> Self {
        Self {
            key: c.key.into_iter().map(|s| s.into()).collect(), // Rule #4
            string: c.string, // Rule #1 for type string?
            hex: c.hex.map(|v| hex::encode(v)), // Rule #1 for type hex?
            mode: c.mode.map(|v| v.try_into().unwrap()),
            generation: c.generation, // Rule #1 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::CreateonionHops> for requests::CreateonionHops {
    fn from(c: pb::CreateonionHops) -> Self {
        Self {
            pubkey: PublicKey::from_slice(&c.pubkey).unwrap(), // Rule #1 for type pubkey
            payload: hex::encode(&c.payload), // Rule #1 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<pb::CreateonionRequest> for requests::CreateonionRequest {
    fn from(c: pb::CreateonionRequest) -> Self {
        Self {
            hops: c.hops.into_iter().map(|s| s.into()).collect(), // Rule #4
            assocdata: hex::encode(&c.assocdata), // Rule #1 for type hex
            session_key: c.session_key.map(|v| v.try_into().unwrap()), // Rule #1 for type secret?
            onion_size: c.onion_size.map(|v| v as u16), // Rule #1 for type u16?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::DeldatastoreRequest> for requests::DeldatastoreRequest {
    fn from(c: pb::DeldatastoreRequest) -> Self {
        Self {
            key: c.key.into_iter().map(|s| s.into()).collect(), // Rule #4
            generation: c.generation, // Rule #1 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::DelexpiredinvoiceRequest> for requests::DelexpiredinvoiceRequest {
    fn from(c: pb::DelexpiredinvoiceRequest) -> Self {
        Self {
            maxexpirytime: c.maxexpirytime, // Rule #1 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::DelinvoiceRequest> for requests::DelinvoiceRequest {
    fn from(c: pb::DelinvoiceRequest) -> Self {
        Self {
            label: c.label, // Rule #1 for type string
            status: c.status.try_into().unwrap(),
            desconly: c.desconly, // Rule #1 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::InvoiceRequest> for requests::InvoiceRequest {
    fn from(c: pb::InvoiceRequest) -> Self {
        Self {
            amount_msat: c.amount_msat.unwrap().into(), // Rule #1 for type msat_or_any
            description: c.description, // Rule #1 for type string
            label: c.label, // Rule #1 for type string
            expiry: c.expiry, // Rule #1 for type u64?
            fallbacks: Some(c.fallbacks.into_iter().map(|s| s.into()).collect()), // Rule #4
            preimage: c.preimage.map(|v| hex::encode(v)), // Rule #1 for type hex?
            cltv: c.cltv, // Rule #1 for type u32?
            deschashonly: c.deschashonly, // Rule #1 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListdatastoreRequest> for requests::ListdatastoreRequest {
    fn from(c: pb::ListdatastoreRequest) -> Self {
        Self {
            key: Some(c.key.into_iter().map(|s| s.into()).collect()), // Rule #4
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListinvoicesRequest> for requests::ListinvoicesRequest {
    fn from(c: pb::ListinvoicesRequest) -> Self {
        Self {
            label: c.label, // Rule #1 for type string?
            invstring: c.invstring, // Rule #1 for type string?
            payment_hash: c.payment_hash.map(|v| hex::encode(v)), // Rule #1 for type hex?
            offer_id: c.offer_id, // Rule #1 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::SendonionFirstHop> for requests::SendonionFirst_hop {
    fn from(c: pb::SendonionFirstHop) -> Self {
        Self {
            id: PublicKey::from_slice(&c.id).unwrap(), // Rule #1 for type pubkey
            amount_msat: c.amount_msat.unwrap().into(), // Rule #1 for type msat
            delay: c.delay as u16, // Rule #1 for type u16
        }
    }
}

#[allow(unused_variables)]
impl From<pb::SendonionRequest> for requests::SendonionRequest {
    fn from(c: pb::SendonionRequest) -> Self {
        Self {
            onion: hex::encode(&c.onion), // Rule #1 for type hex
            first_hop: c.first_hop.unwrap().into(),
            payment_hash: Sha256::from_slice(&c.payment_hash).unwrap(), // Rule #1 for type hash
            label: c.label, // Rule #1 for type string?
            shared_secrets: Some(c.shared_secrets.into_iter().map(|s| s.try_into().unwrap()).collect()), // Rule #4
            partid: c.partid.map(|v| v as u16), // Rule #1 for type u16?
            bolt11: c.bolt11, // Rule #1 for type string?
            amount_msat: c.amount_msat.map(|a| a.into()), // Rule #1 for type msat?
            destination: c.destination.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey?
            localinvreqid: c.localinvreqid.map(|v| Sha256::from_slice(&v).unwrap()), // Rule #1 for type hash?
            groupid: c.groupid, // Rule #1 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListsendpaysRequest> for requests::ListsendpaysRequest {
    fn from(c: pb::ListsendpaysRequest) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #1 for type string?
            payment_hash: c.payment_hash.map(|v| Sha256::from_slice(&v).unwrap()), // Rule #1 for type hash?
            status: c.status.map(|v| v.try_into().unwrap()),
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListtransactionsRequest> for requests::ListtransactionsRequest {
    fn from(c: pb::ListtransactionsRequest) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<pb::PayRequest> for requests::PayRequest {
    fn from(c: pb::PayRequest) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #1 for type string
            amount_msat: c.amount_msat.map(|a| a.into()), // Rule #1 for type msat?
            label: c.label, // Rule #1 for type string?
            riskfactor: c.riskfactor, // Rule #1 for type number?
            maxfeepercent: c.maxfeepercent, // Rule #1 for type number?
            retry_for: c.retry_for.map(|v| v as u16), // Rule #1 for type u16?
            maxdelay: c.maxdelay.map(|v| v as u16), // Rule #1 for type u16?
            exemptfee: c.exemptfee.map(|a| a.into()), // Rule #1 for type msat?
            localinvreqid: c.localinvreqid.map(|v| hex::encode(v)), // Rule #1 for type hex?
            exclude: Some(c.exclude.into_iter().map(|s| s.into()).collect()), // Rule #4
            maxfee: c.maxfee.map(|a| a.into()), // Rule #1 for type msat?
            description: c.description, // Rule #1 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListnodesRequest> for requests::ListnodesRequest {
    fn from(c: pb::ListnodesRequest) -> Self {
        Self {
            id: c.id.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::WaitanyinvoiceRequest> for requests::WaitanyinvoiceRequest {
    fn from(c: pb::WaitanyinvoiceRequest) -> Self {
        Self {
            lastpay_index: c.lastpay_index, // Rule #1 for type u64?
            timeout: c.timeout, // Rule #1 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::WaitinvoiceRequest> for requests::WaitinvoiceRequest {
    fn from(c: pb::WaitinvoiceRequest) -> Self {
        Self {
            label: c.label, // Rule #1 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<pb::WaitsendpayRequest> for requests::WaitsendpayRequest {
    fn from(c: pb::WaitsendpayRequest) -> Self {
        Self {
            payment_hash: Sha256::from_slice(&c.payment_hash).unwrap(), // Rule #1 for type hash
            timeout: c.timeout, // Rule #1 for type u32?
            partid: c.partid, // Rule #1 for type u64?
            groupid: c.groupid, // Rule #1 for type u64?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::NewaddrRequest> for requests::NewaddrRequest {
    fn from(c: pb::NewaddrRequest) -> Self {
        Self {
            addresstype: c.addresstype.map(|v| v.try_into().unwrap()),
        }
    }
}

#[allow(unused_variables)]
impl From<pb::WithdrawRequest> for requests::WithdrawRequest {
    fn from(c: pb::WithdrawRequest) -> Self {
        Self {
            destination: c.destination, // Rule #1 for type string
            satoshi: c.satoshi.map(|a| a.into()), // Rule #1 for type msat_or_all?
            feerate: c.feerate.map(|a| a.into()), // Rule #1 for type feerate?
            minconf: c.minconf.map(|v| v as u16), // Rule #1 for type u16?
            utxos: Some(c.utxos.into_iter().map(|s| s.into()).collect()), // Rule #4
        }
    }
}

#[allow(unused_variables)]
impl From<pb::KeysendRequest> for requests::KeysendRequest {
    fn from(c: pb::KeysendRequest) -> Self {
        Self {
            destination: PublicKey::from_slice(&c.destination).unwrap(), // Rule #1 for type pubkey
            amount_msat: c.amount_msat.unwrap().into(), // Rule #1 for type msat
            label: c.label, // Rule #1 for type string?
            maxfeepercent: c.maxfeepercent, // Rule #1 for type number?
            retry_for: c.retry_for, // Rule #1 for type u32?
            maxdelay: c.maxdelay, // Rule #1 for type u32?
            exemptfee: c.exemptfee.map(|a| a.into()), // Rule #1 for type msat?
            routehints: c.routehints.map(|rl| rl.into()), // Rule #1 for type RoutehintList?
            extratlvs: c.extratlvs.map(|s| s.into()), // Rule #1 for type TlvStream?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::FundpsbtRequest> for requests::FundpsbtRequest {
    fn from(c: pb::FundpsbtRequest) -> Self {
        Self {
            satoshi: c.satoshi.unwrap().into(), // Rule #1 for type msat_or_all
            feerate: c.feerate.unwrap().into(), // Rule #1 for type feerate
            startweight: c.startweight, // Rule #1 for type u32
            minconf: c.minconf, // Rule #1 for type u32?
            reserve: c.reserve, // Rule #1 for type u32?
            locktime: c.locktime, // Rule #1 for type u32?
            min_witness_weight: c.min_witness_weight, // Rule #1 for type u32?
            excess_as_change: c.excess_as_change, // Rule #1 for type boolean?
            nonwrapped: c.nonwrapped, // Rule #1 for type boolean?
            opening_anchor_channel: c.opening_anchor_channel, // Rule #1 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::SendpsbtRequest> for requests::SendpsbtRequest {
    fn from(c: pb::SendpsbtRequest) -> Self {
        Self {
            psbt: c.psbt, // Rule #1 for type string
            reserve: c.reserve, // Rule #1 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::SignpsbtRequest> for requests::SignpsbtRequest {
    fn from(c: pb::SignpsbtRequest) -> Self {
        Self {
            psbt: c.psbt, // Rule #1 for type string
            signonly: Some(c.signonly.into_iter().map(|s| s).collect()), // Rule #4
        }
    }
}

#[allow(unused_variables)]
impl From<pb::UtxopsbtRequest> for requests::UtxopsbtRequest {
    fn from(c: pb::UtxopsbtRequest) -> Self {
        Self {
            satoshi: c.satoshi.unwrap().into(), // Rule #1 for type msat
            feerate: c.feerate.unwrap().into(), // Rule #1 for type feerate
            startweight: c.startweight, // Rule #1 for type u32
            utxos: c.utxos.into_iter().map(|s| s.into()).collect(), // Rule #4
            reserve: c.reserve, // Rule #1 for type u32?
            reservedok: c.reservedok, // Rule #1 for type boolean?
            locktime: c.locktime, // Rule #1 for type u32?
            min_witness_weight: c.min_witness_weight, // Rule #1 for type u32?
            excess_as_change: c.excess_as_change, // Rule #1 for type boolean?
            opening_anchor_channel: c.opening_anchor_channel, // Rule #1 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::TxdiscardRequest> for requests::TxdiscardRequest {
    fn from(c: pb::TxdiscardRequest) -> Self {
        Self {
            txid: hex::encode(&c.txid), // Rule #1 for type txid
        }
    }
}

#[allow(unused_variables)]
impl From<pb::TxprepareRequest> for requests::TxprepareRequest {
    fn from(c: pb::TxprepareRequest) -> Self {
        Self {
            outputs: c.outputs.into_iter().map(|s| s.into()).collect(), // Rule #4
            feerate: c.feerate.map(|a| a.into()), // Rule #1 for type feerate?
            minconf: c.minconf, // Rule #1 for type u32?
            utxos: Some(c.utxos.into_iter().map(|s| s.into()).collect()), // Rule #4
        }
    }
}

#[allow(unused_variables)]
impl From<pb::TxsendRequest> for requests::TxsendRequest {
    fn from(c: pb::TxsendRequest) -> Self {
        Self {
            txid: hex::encode(&c.txid), // Rule #1 for type txid
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListpeerchannelsRequest> for requests::ListpeerchannelsRequest {
    fn from(c: pb::ListpeerchannelsRequest) -> Self {
        Self {
            id: c.id.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListclosedchannelsRequest> for requests::ListclosedchannelsRequest {
    fn from(c: pb::ListclosedchannelsRequest) -> Self {
        Self {
            id: c.id.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::DecodepayRequest> for requests::DecodepayRequest {
    fn from(c: pb::DecodepayRequest) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #1 for type string
            description: c.description, // Rule #1 for type string?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::DecodeRequest> for requests::DecodeRequest {
    fn from(c: pb::DecodeRequest) -> Self {
        Self {
            string: c.string, // Rule #1 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<pb::DisconnectRequest> for requests::DisconnectRequest {
    fn from(c: pb::DisconnectRequest) -> Self {
        Self {
            id: PublicKey::from_slice(&c.id).unwrap(), // Rule #1 for type pubkey
            force: c.force, // Rule #1 for type boolean?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::FeeratesRequest> for requests::FeeratesRequest {
    fn from(c: pb::FeeratesRequest) -> Self {
        Self {
            style: c.style.try_into().unwrap(),
        }
    }
}

#[allow(unused_variables)]
impl From<pb::FundchannelRequest> for requests::FundchannelRequest {
    fn from(c: pb::FundchannelRequest) -> Self {
        Self {
            id: PublicKey::from_slice(&c.id).unwrap(), // Rule #1 for type pubkey
            amount: c.amount.unwrap().into(), // Rule #1 for type msat_or_all
            feerate: c.feerate.map(|a| a.into()), // Rule #1 for type feerate?
            announce: c.announce, // Rule #1 for type boolean?
            minconf: c.minconf, // Rule #1 for type u32?
            push_msat: c.push_msat.map(|a| a.into()), // Rule #1 for type msat?
            close_to: c.close_to, // Rule #1 for type string?
            request_amt: c.request_amt.map(|a| a.into()), // Rule #1 for type msat?
            compact_lease: c.compact_lease, // Rule #1 for type string?
            utxos: Some(c.utxos.into_iter().map(|s| s.into()).collect()), // Rule #4
            mindepth: c.mindepth, // Rule #1 for type u32?
            reserve: c.reserve.map(|a| a.into()), // Rule #1 for type msat?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::GetrouteRequest> for requests::GetrouteRequest {
    fn from(c: pb::GetrouteRequest) -> Self {
        Self {
            id: PublicKey::from_slice(&c.id).unwrap(), // Rule #1 for type pubkey
            amount_msat: c.amount_msat.unwrap().into(), // Rule #1 for type msat
            riskfactor: c.riskfactor, // Rule #1 for type u64
            cltv: c.cltv, // Rule #1 for type number?
            fromid: c.fromid.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey?
            fuzzpercent: c.fuzzpercent, // Rule #1 for type u32?
            exclude: Some(c.exclude.into_iter().map(|s| s.into()).collect()), // Rule #4
            maxhops: c.maxhops, // Rule #1 for type u32?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListforwardsRequest> for requests::ListforwardsRequest {
    fn from(c: pb::ListforwardsRequest) -> Self {
        Self {
            status: c.status.map(|v| v.try_into().unwrap()),
            in_channel: c.in_channel.map(|v| cln_rpc::primitives::ShortChannelId::from_str(&v).unwrap()), // Rule #1 for type short_channel_id?
            out_channel: c.out_channel.map(|v| cln_rpc::primitives::ShortChannelId::from_str(&v).unwrap()), // Rule #1 for type short_channel_id?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::ListpaysRequest> for requests::ListpaysRequest {
    fn from(c: pb::ListpaysRequest) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #1 for type string?
            payment_hash: c.payment_hash.map(|v| Sha256::from_slice(&v).unwrap()), // Rule #1 for type hash?
            status: c.status.map(|v| v.try_into().unwrap()),
        }
    }
}

#[allow(unused_variables)]
impl From<pb::PingRequest> for requests::PingRequest {
    fn from(c: pb::PingRequest) -> Self {
        Self {
            id: PublicKey::from_slice(&c.id).unwrap(), // Rule #1 for type pubkey
            len: c.len.map(|v| v as u16), // Rule #1 for type u16?
            pongbytes: c.pongbytes.map(|v| v as u16), // Rule #1 for type u16?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::SendcustommsgRequest> for requests::SendcustommsgRequest {
    fn from(c: pb::SendcustommsgRequest) -> Self {
        Self {
            node_id: PublicKey::from_slice(&c.node_id).unwrap(), // Rule #1 for type pubkey
            msg: hex::encode(&c.msg), // Rule #1 for type hex
        }
    }
}

#[allow(unused_variables)]
impl From<pb::SetchannelRequest> for requests::SetchannelRequest {
    fn from(c: pb::SetchannelRequest) -> Self {
        Self {
            id: c.id, // Rule #1 for type string
            feebase: c.feebase.map(|a| a.into()), // Rule #1 for type msat?
            feeppm: c.feeppm, // Rule #1 for type u32?
            htlcmin: c.htlcmin.map(|a| a.into()), // Rule #1 for type msat?
            htlcmax: c.htlcmax.map(|a| a.into()), // Rule #1 for type msat?
            enforcedelay: c.enforcedelay, // Rule #1 for type u32?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::SigninvoiceRequest> for requests::SigninvoiceRequest {
    fn from(c: pb::SigninvoiceRequest) -> Self {
        Self {
            invstring: c.invstring, // Rule #1 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<pb::SignmessageRequest> for requests::SignmessageRequest {
    fn from(c: pb::SignmessageRequest) -> Self {
        Self {
            message: c.message, // Rule #1 for type string
        }
    }
}

#[allow(unused_variables)]
impl From<pb::StopRequest> for requests::StopRequest {
    fn from(c: pb::StopRequest) -> Self {
        Self {
        }
    }
}

#[allow(unused_variables)]
impl From<pb::PreapprovekeysendRequest> for requests::PreapprovekeysendRequest {
    fn from(c: pb::PreapprovekeysendRequest) -> Self {
        Self {
            destination: c.destination.map(|v| PublicKey::from_slice(&v).unwrap()), // Rule #1 for type pubkey?
            payment_hash: c.payment_hash.map(|v| hex::encode(v)), // Rule #1 for type hex?
            amount_msat: c.amount_msat.map(|a| a.into()), // Rule #1 for type msat?
        }
    }
}

#[allow(unused_variables)]
impl From<pb::PreapproveinvoiceRequest> for requests::PreapproveinvoiceRequest {
    fn from(c: pb::PreapproveinvoiceRequest) -> Self {
        Self {
            bolt11: c.bolt11, // Rule #1 for type string?
        }
    }
}

