Architecture ============ .. mermaid:: :title: Frame architecture classDiagram Frame *-- FrameState : state FrameState *-- HeaderType : header_type Answer --|> HeaderType Error --|> HeaderType Message --|> HeaderType Null --|> HeaderType Reply --|> HeaderType Frame ..> PossibleHeaderType : used during initialization FrameState ..> PossibleHeaderType : used during initialization HeaderType ..> PossibleHeaderType : used to make the corresponding object Frame ..> ContinuationIndicator : used during initialization FrameState ..> ContinuationIndicator : used during initialization HeaderType ..> ContinuationIndicator : used in make Answer ..> ContinuationIndicator : continuation_indicator Error ..> ContinuationIndicator : continuation_indicator Message ..> ContinuationIndicator : continuation_indicator Reply ..> ContinuationIndicator : continuation_indicator class ContinuationIndicator { <> COMPLETE INTERMEDIATE } class PossibleHeaderType { <> ANS ERR MSG NUL RPY } class Frame { +bytes payload +FrameState state +bytes build() +Frame(payload: bytes, channel_number: int, message_number: int, sequence_number: int, answer_number: int | None, continuation_indicator: ContinuationIndicator, possible_header_type: PossibleHeaderType) } class FrameState { +Frame frame +HeaderType header_type +int channel_number +int message_number +int sequence_number +bytes build() +FrameState(frame: Frame, channel_number: int, message_number: int, sequence_number: int, answer_number: int | None, continuation_indicator: ContinuationIndicator, possible_header_type: PossibleHeaderType) } class HeaderType { +FrameState state +bytes build() +HeaderType make(state: FrameState, continuation_indicator: ContinuationIndicator, possible_header_type: PossibleHeaderType, answer_number: int | None)$ +HeaderType(state:FrameState) } class Answer { +int answer_number +ContinuationIndicator continuation_indicator +Answer(state: FrameState, answer_number: int, continuation_indicator: ContinuationIndicator) } class Error { +ContinuationIndicator continuation_indicator +Error(state: FrameState, continuation_indicator: ContinuationIndicator) } class Message { +ContinuationIndicator continuation_indicator +Message(state: FrameState, continuation_indicator: ContinuationIndicator) } class Null {} class Reply { +ContinuationIndicator continuation_indicator +Reply(state: FrameState, continuation_indicator: ContinuationIndicator) } State ----- This library use class as state. A ``Frame`` class can have different header. Instead of creating multiple class like ``MessageFrame``, ``AnswerFrame``, etc. I chose to store the header as a state of ``Frame`` (``FrameState`` being the state holder and manager). As each state can have different behaviors, any behaviors dependents of the header must be defined in the specific ``HeaderType``.