Coverage for src/galaxy_beep_frame/frame/header_type/answer.py: 100%
14 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-31 04:18 +0200
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-31 04:18 +0200
1"""Answer class."""
3from dataclasses import dataclass
4from typing import TYPE_CHECKING
6from galaxy_beep_frame.constant import (
7 ANSWER_NUMBER_MAX,
8 ANSWER_NUMBER_MIN,
9)
10from galaxy_beep_frame.exception.frame import (
11 AboveRangeError,
12 BelowRangeError,
13)
15from .base import HeaderType
17if TYPE_CHECKING:
18 from .continuation_indicator import ContinuationIndicator
21@dataclass(frozen=True)
22class Answer(HeaderType):
23 """Answer type."""
25 continuation_indicator: ContinuationIndicator
26 answer_number: int
28 def __post_init__(self) -> None:
29 """Check range on sequence number."""
31 if self.answer_number < ANSWER_NUMBER_MIN:
32 raise BelowRangeError(
33 self.answer_number,
34 ANSWER_NUMBER_MIN,
35 "answer number",
36 )
37 if self.answer_number > ANSWER_NUMBER_MAX:
38 raise AboveRangeError(
39 self.answer_number,
40 ANSWER_NUMBER_MAX,
41 "answer number",
42 )
44 def build(self, size: int) -> bytes:
45 """Build the header of this Frame."""
47 return (
48 b"ANS "
49 + (
50 f"{self.state.channel_number} "
51 f"{self.state.message_number} "
52 f"{self.continuation_indicator.value} "
53 f"{self.state.sequence_number} {size} "
54 f"{self.answer_number}"
55 ).encode()
56 )