Skip to main content

qubit_codec/transcode/engine/
transcode_convert_hooks.rs

1// =============================================================================
2//    Copyright (c) 2026 Haixing Hu.
3//
4//    SPDX-License-Identifier: Apache-2.0
5//
6//    Licensed under the Apache License, Version 2.0.
7// =============================================================================
8//! Policy hooks used by buffered convert engines.
9
10use super::{
11    transcode_decode_hooks::TranscodeDecodeHooks,
12    transcode_encode_hooks::TranscodeEncodeHooks,
13};
14use crate::Codec;
15
16/// Policy hooks for [`crate::TranscodeConvertEngine`].
17///
18/// Convert hooks no longer own decoded pending values or the conversion loop.
19/// The engine owns source/target cursor state, retained decoded values, output
20/// capacity checks, and final progress reporting. Hooks only select the
21/// decode/encode policies used by the internal buffered engines and map their
22/// errors into one converter-level error type.
23///
24/// # Type Parameters
25///
26/// - `D`: Source-side decode codec owned by the converter engine.
27/// - `E`: Target-side encode codec owned by the converter engine.
28pub trait TranscodeConvertHooks<D, E>
29where
30    D: Codec,
31    E: Codec<Value = D::Value>,
32{
33    /// Domain error type returned by the buffered converter.
34    type Error;
35
36    /// Error type returned by the selected decode hooks.
37    type DecodeError;
38
39    /// Error type returned by the selected encode hooks.
40    type EncodeError;
41
42    /// Decode policy hooks used by the internal buffered decoder.
43    type DecodeHooks: TranscodeDecodeHooks<D, Error = Self::DecodeError>;
44
45    /// Encode policy hooks used by the internal buffered encoder.
46    type EncodeHooks: TranscodeEncodeHooks<E, Error = Self::EncodeError>;
47
48    /// Creates decode policy hooks for the internal buffered decoder.
49    ///
50    /// # Parameters
51    ///
52    /// - `decode_codec`: Source codec owned by the converter engine.
53    /// - `encode_codec`: Target codec owned by the converter engine.
54    ///
55    /// # Returns
56    ///
57    /// Returns the decode hooks used by the internal buffered decoder.
58    fn create_decode_hooks(
59        &self,
60        decode_codec: &D,
61        encode_codec: &E,
62    ) -> Self::DecodeHooks;
63
64    /// Creates encode policy hooks for the internal buffered encoder.
65    ///
66    /// # Parameters
67    ///
68    /// - `decode_codec`: Source codec owned by the converter engine.
69    /// - `encode_codec`: Target codec owned by the converter engine.
70    ///
71    /// # Returns
72    ///
73    /// Returns the encode hooks used by the internal buffered encoder.
74    fn create_encode_hooks(
75        &self,
76        decode_codec: &D,
77        encode_codec: &E,
78    ) -> Self::EncodeHooks;
79
80    /// Maps a decode-engine error into the converter error type.
81    ///
82    /// # Parameters
83    ///
84    /// - `error`: Error returned by the selected decode hooks.
85    ///
86    /// # Returns
87    ///
88    /// Returns the converter-level error.
89    fn map_decode_error(&self, error: Self::DecodeError) -> Self::Error;
90
91    /// Maps an encode-engine error into the converter error type.
92    ///
93    /// # Parameters
94    ///
95    /// - `error`: Error returned by the selected encode hooks.
96    ///
97    /// # Returns
98    ///
99    /// Returns the converter-level error.
100    fn map_encode_error(&self, error: Self::EncodeError) -> Self::Error;
101
102    /// Resets conversion-level hook-owned state.
103    ///
104    /// The common engine clears pending decoded values and resets internal
105    /// decode/encode engines separately.
106    #[inline(always)]
107    fn reset(&mut self) {}
108}