# internal/nsdxml — сериализация и парсинг XML по правилам НРД ## Что реализовано - **`Marshal(v) ([]byte, error)` / `Unmarshal(data, v) error`** — сериализация и разбор XML с прологом ``. `Unmarshal` понимает как windows-1251, так и UTF-8 на входе через `CharsetReader`. - **Кодек windows-1251** (собственный, без внешних зависимостей): `EncodeWindows1251`, `DecodeWindows1251`. Таблица соответствия CP1251 ↔ Unicode для байтов 0x80..0xFF. Руны, не выразимые в CP1251, приводят к ошибке `ErrUnmappable`. - **`CharsetReader(charset, input)`** — пригодно к использованию в `xml.Decoder.CharsetReader`. Поддерживает `windows-1251`, `cp1251`, `utf-8`, отсутствие charset; на другие — ошибка. - **`NSDDateTime`** — отметка времени НРД формата `YYYY-MM-DDThh:mm:ss(МСК[+-N])`, regex из XSD: `[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\(МСК([+-][0-9]{1,2})?\)`. Реализованы `MarshalXML`, `UnmarshalXML`, `MarshalText`, `UnmarshalText`, `String`, `Now`. Сохраняет различие между «(МСК)» без сдвига и «(МСК+0)» через `OffsetSpecified`. ## Кодек windows-1251 Реализован через штатный `golang.org/x/text/encoding/charmap.Windows1251`. Изначально (PR-1) была собственная таблица CP1251 — обход блокировки zetit-прокси на `proxy.golang.org`; после открытия доступа (через `NO_PROXY=*.golang.org` и пр.) заменено на штатную реализацию. ## Тесты - Round-trip на ASCII и кириллице, включая cp1251-пунктуацию (`№`, `©`, `«»`, `„"`). - Негативный кейс — недостижимая руна (эмодзи) даёт `ErrUnmappable`. - `NSDDateTime` на всех вариантах смещения: `(МСК)`, `(МСК+2)`, `(МСК-1)`, `(МСК+12)`. - Покрытие — 92.5%.