1"""Parsing error value preservation."""
2
3
4from typing import Any, ClassVar
5
6from icalendar.compatibility import Self
7from icalendar.parser import Parameters
8from icalendar.parser_tools import DEFAULT_ENCODING
9from icalendar.prop.text import vText
10
11
12class vBrokenProperty(vText):
13 """Property that failed to parse, preserving raw value as text.
14
15 Represents property values that failed to parse with their expected
16 type. The raw iCalendar string is preserved for round-trip serialization.
17 """
18
19 default_value: ClassVar[str] = "TEXT"
20 __slots__ = ("expected_type", "parse_error", "property_name")
21
22 def __new__(
23 cls,
24 value: str | bytes,
25 encoding: str = DEFAULT_ENCODING,
26 /,
27 params: dict[str, Any] | None = None,
28 expected_type: str | None = None,
29 property_name: str | None = None,
30 parse_error: str | None = None,
31 ) -> Self:
32 self = super().__new__(cls, value, encoding, params=params)
33 object.__setattr__(self, "expected_type", expected_type)
34 object.__setattr__(self, "property_name", property_name)
35 object.__setattr__(self, "parse_error", parse_error)
36 return self
37
38 def __repr__(self) -> str:
39 return (
40 f"vBrokenProperty({str(self)!r}, "
41 f"expected_type={self.expected_type!r}, "
42 f"property_name={self.property_name!r})"
43 )
44
45 @classmethod
46 def from_parse_error(
47 cls,
48 raw_value: str,
49 params: Parameters,
50 property_name: str,
51 expected_type: str,
52 error: Exception,
53 ) -> Self:
54 """Create vBrokenProperty from parse failure."""
55 return cls(
56 raw_value,
57 params=params,
58 expected_type=expected_type,
59 property_name=property_name,
60 parse_error=str(error),
61 )
62
63 @classmethod
64 def examples(cls) -> list[Self]:
65 """Examples of vBrokenProperty."""
66 return [
67 cls(
68 "INVALID-DATE",
69 expected_type="date-time",
70 property_name="DTSTART",
71 parse_error="Invalid date format",
72 )
73 ]
74
75__all__ = ["vBrokenProperty"]