use crate::{TxOut, Txid, Vout};
use bitcoin::ScriptBuf;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize, Serializer, ser::SerializeStruct};
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct TxIn {
#[schemars(example = "0000000000000000000000000000000000000000000000000000000000000000")]
pub txid: Txid,
#[schemars(example = 0)]
pub vout: Vout,
#[schemars(example = None as Option<TxOut>)]
pub prevout: Option<TxOut>,
#[schemars(
rename = "scriptsig",
with = "String",
example = "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73"
)]
pub script_sig: ScriptBuf,
#[schemars(
rename = "scriptsig_asm",
with = "String",
example = "OP_PUSHBYTES_4 ffff001d OP_PUSHBYTES_1 04 OP_PUSHBYTES_69 5468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73"
)]
pub script_sig_asm: (),
#[schemars(example = false)]
pub is_coinbase: bool,
#[schemars(example = 429496729)]
pub sequence: u32,
#[allow(dead_code)]
#[schemars(
rename = "inner_redeemscript_asm",
with = "Option<String>",
example = Some("OP_0 OP_PUSHBYTES_20 992a1f7420fc5285070d19c71ff2efb1e356ad2f".to_string())
)]
pub inner_redeem_script_asm: (),
}
impl TxIn {
pub fn script_sig_asm(&self) -> String {
self.script_sig.to_asm_string()
}
pub fn inner_redeemscript_asm(&self) -> String {
self.script_sig
.redeem_script()
.map(|s| s.to_asm_string())
.unwrap_or_default()
}
}
impl Serialize for TxIn {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("TxIn", 8)?;
state.serialize_field("txid", &self.txid)?;
state.serialize_field("vout", &self.vout)?;
state.serialize_field("prevout", &self.prevout)?;
state.serialize_field("scriptsig", &self.script_sig.to_hex_string())?;
state.serialize_field("scriptsig_asm", &self.script_sig_asm())?;
state.serialize_field("is_coinbase", &self.is_coinbase)?;
state.serialize_field("sequence", &self.sequence)?;
state.serialize_field("inner_redeemscript_asm", &self.inner_redeemscript_asm())?;
state.end()
}
}