domain

package
v0.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 11, 2026 License: MIT Imports: 6 Imported by: 0

Documentation

Overview

Package domain содержит базовые понятия справочника: классы приборов, системы обозначений и их разбор, единицы (коды), материалы и ошибки.

Пакет не зависит от БД и форматов наполнения. Ошибки — значения (*domain.Error с машиночитаемым кодом), без паник; тексты сообщений — дословный контракт, закреплённый тестами (языковая политика — D9: до каталога сообщений тексты формируются по-русски).

Index

Constants

This section is empty.

Variables

View Source
var ClassificationFieldCodes = []string{
	"material", "subclass", "adjustment", "category", "assembly",
}

ClassificationFieldCodes — коды классификационных полей, допустимых в секции fields формата наполнения (документация формата и валидация сервисного слоя). Поля грамматик систем (dev_number, letters, group, …) парсер устанавливает сам; исключение — записи без разбора (other): для них секция fields может задать поле семейства (D10).

View Source
var OtherFieldCodes = []string{
	"series", "dev_number", "letters",
}

OtherFieldCodes — грамматические поля, допустимые в секции fields только для записей other (разбора нет — пер-полое правило D10 выполняется тривиально): семейство, номер разработки, буквы. Значения свободные (не словарь): series/letters — непустой текст, dev_number — положительное целое; применимость — все классы.

Functions

func AdjustmentCodes

func AdjustmentCodes() []string

AdjustmentCodes перечисляет коды словаря в стабильном порядке (аргумент перечня допустимых в сообщениях об ошибках).

func Canonicalize

func Canonicalize(text string) (string, error)

Canonicalize нормализует обозначение на входе (план 03 §2.4): trim, верхний регистр, удаление пробелов, типографские дефисы → «-», запятая → точка (десятичный разделитель хвостов-мощностей). Кириллица и латиница не смешиваются в одном обозначении — смешение алфавитов диагностируется ошибкой с указанием позиции.

func CapGroupKnown

func CapGroupKnown(group int) bool

CapGroupKnown сообщает, входит ли группа подкласса К в таблицу (перспективные и исторические); используется тестами и будущими сидами.

func CapacitorPrefixAdjustment

func CapacitorPrefixAdjustment(prefix string) string

CapacitorPrefixAdjustment отображает подкласс конденсаторной грамматики (К, КТ, КП, КН, КС) в код способа подстройки.

func ClassificationFieldAppliesTo

func ClassificationFieldAppliesTo(field string, kind Kind) bool

ClassificationFieldAppliesTo сообщает, применимо ли классификационное поле к классу записи.

func DesignationFieldCodes

func DesignationFieldCodes() []string

DesignationFieldCodes перечисляет коды реестра полей разбора в стабильном порядке (для тестов полноты бандлов internal/i18n: field.<код> — D9).

func GostEquivalentSymbol

func GostEquivalentSymbol(r rune) (rune, bool)

GostEquivalentSymbol возвращает парный равнозначный символ материала ГОСТ (Г ↔ 1, К ↔ 2, А ↔ 3, И ↔ 4, Д ↔ 5, П ↔ 6) — только для подсказки find у полупроводников gost; записи с обоими символами раздельны (03 §2.1).

func GostSubclassBySymbol

func GostSubclassBySymbol(r rune) (string, bool)

GostSubclassBySymbol ищет код подкласса по букве ГОСТ (поддерживаемые классами модуля однобуквенные формы: Т, П, Д, С, В, А, И, Г, Л, Ц, Ф).

func JisSubclassByLetter

func JisSubclassByLetter(r rune) (string, bool)

JisSubclassByLetter ищет код подкласса по букве класса JIS.

func KnownDesignationField

func KnownDesignationField(name string) bool

KnownDesignationField сообщает, существует ли поле разбора с кодом name.

func MsgArg

func MsgArg(id MsgID, args ...any) any

MsgArg возвращает аргумент-сообщение для слоёв над domain: при рендере родительского формата подставляется локализованный текст вложенного сообщения (позиционные префиксы вида «раздел units, «кВ»»).

func Msgf

func Msgf(id MsgID, args ...any) string

Msgf возвращает канонический (en) текст сообщения — для заполнения Message при конструировании ошибок.

func NumericDesignationField

func NumericDesignationField(name string) (numeric, known bool)

NumericDesignationField возвращает разряд поля разбора: числовое либо текстовое (второе значение — существование поля; числовые поля допускают eq-фильтр и числовую сортировку).

func OtherFieldKnown added in v0.0.2

func OtherFieldKnown(name string) bool

OtherFieldKnown сообщает, входит ли имя в реестр полей для other.

func ParserFieldKnown

func ParserFieldKnown(system System, kind Kind, field string) bool

ParserFieldKnown сообщает, способна ли система обозначений установить поле разбора сама для класса записи (продукты грамматики парсера).

func ProSubclassByLetter

func ProSubclassByLetter(r rune) (string, bool)

ProSubclassByLetter ищет код подкласса по второй букве PRO ELECTRON.

func ResistorFamilyAdjustment

func ResistorFamilyAdjustment(family string) string

ResistorFamilyAdjustment отображает семейство резисторных грамматик (gost: С/СП; ost: Р/РП/НР) в код способа подстройки.

func SubclassCodes

func SubclassCodes() []string

SubclassCodes перечисляет коды словаря подклассов в стабильном порядке (аргумент перечня допустимых в сообщениях об ошибках).

func SystemAppliesToKind

func SystemAppliesToKind(s System, k Kind) bool

SystemAppliesToKind сообщает, применима ли система к классу (проверяется метасхемой импорта и автодетектом).

Types

type Adjustment

type Adjustment struct {
	Code string // стабильный код словаря: «fixed», «variable», «preset»
}

Способ подстройки номинала: единый словарь значений для сквозного фильтра по полю adjustment между системами обозначений резисторов и конденсаторов (docs/plan/03-data-model.md §2.2–§2.3).

Ключ словаря — стабильный код (латиница, D9): значение поля adjustment разбора обозначений, device_designation_fields.text_value и фильтры поиска оперируют кодом; отображаемые названия — бандлы internal/i18n (adjustment.<код>). Отображения задают парсеры: семейства резисторов ГОСТ 3453-68 (С постоянные, СП переменные) и ОСТ 11.074.009-78 (Р постоянные, РП переменные; НР — наборы постоянных), подклассы конденсаторов (К постоянной ёмкости, КТ подстроечные, КП переменной ёмкости; КН нелинейные и КС сборки — не перестраиваемые вручную). Записи other задают поле явно секцией fields (нелинейные различия подстроечный/переменный у конкретных семейств — наполнением).

func AdjustmentByCode

func AdjustmentByCode(code string) (Adjustment, bool)

AdjustmentByCode ищет способ подстройки по стабильному коду словаря.

func Adjustments

func Adjustments() []Adjustment

Adjustments возвращает словарь способов подстройки в стабильном порядке.

type Code

type Code string

Code — машиночитаемый код ошибки (латиница, snake_case).

const (
	CodeAlreadyExists          Code = "already_exists"
	CodeAttributeNotApplicable Code = "attribute_not_applicable"
	CodeDatabaseNotInitialized Code = "database_not_initialized"
	CodeDesignationMismatch    Code = "designation_mismatch"
	CodeInvalidDesignation     Code = "invalid_designation"
	CodeInvalidImportFile      Code = "invalid_import_file"
	CodeInternal               Code = "internal_error"
	CodeKindAmbiguous          Code = "kind_ambiguous"
	CodeKindNotSupported       Code = "kind_not_supported"
	CodeMethodNotAllowed       Code = "method_not_allowed"
	CodeNotFound               Code = "not_found"
	CodeParameterNotApplicable Code = "parameter_not_applicable"
	CodePowerSuffix            Code = "power_suffix_not_supported"
	CodeSchemaVersionMismatch  Code = "schema_version_mismatch"
	CodeSeedFailed             Code = "seed_failed"
	CodeStorageDDLFailed       Code = "storage_ddl_failed"
	CodeStorageOpenFailed      Code = "storage_open_failed"
	CodeUnknownAttribute       Code = "unknown_attribute"
	CodeUnknownCondition       Code = "unknown_condition"
	CodeUnknownParameter       Code = "unknown_parameter"
	CodeValidationFailed       Code = "validation_failed"
)

Реестр кодов ошибок — контракт CLI, REST и импорта; коды стабильны, изменение кода — несовместимое изменение. Исходный перечень — docs/plan/01-architecture.md §2.1, расширяется по мере этапов плана.

func KnownCodes

func KnownCodes() []Code

KnownCodes возвращает все зарегистрированные коды, отсортированные.

func (Code) IsKnown

func (c Code) IsKnown() bool

IsKnown сообщает, зарегистрирован ли код в реестре.

type Error

type Error struct {
	Code    Code
	MsgID   MsgID
	Args    []any
	Message string
}

Error — ожидаемая ошибка модуля: машиночитаемый код, стабильный идентификатор сообщения каталога и аргументы рендера (этап 8.3, D9). Message — канонический en-рендер (для журналов и тестов); тексты — контракт: en-формат закреплён каноническим, ru — бандл internal/i18n; переформулировка формата — несовместимое изменение. Локализованный рендер по MsgID+Args выполняют транспорты.

func AsError

func AsError(err error) (*Error, bool)

AsError извлекает *Error из цепочки ошибок; классификация «ожидаемая/непредвиденная» для вывода CLI и статусов REST.

func DatabaseNotInitialized

func DatabaseNotInitialized() *Error

DatabaseNotInitialized — в базе нет таблицы schema_meta: база не инициализирована, принадлежит другой программе или повреждена.

func KindAmbiguous

func KindAmbiguous() *Error

KindAmbiguous — класс не определяется по обозначению однозначно (фотоприборы: фотодиоды и фототранзисторы) — требуется явное указание класса (ключ kind / --kind), которое переопределяет автодетект.

func KindNotSupported

func KindNotSupported() *Error

KindNotSupported — обозначение принадлежит классу приборов, не поддерживаемому модулем.

func NewErrorf

func NewErrorf(code Code, id MsgID, args ...any) *Error

NewErrorf создаёт ожидаемую ошибку по коду и сообщению каталога.

func SchemaVersionMismatch

func SchemaVersionMismatch(dbVersion, moduleVersion int) *Error

SchemaVersionMismatch — версия схемы базы (dbVersion) не совпадает с версией модуля (moduleVersion); продолжение работы запрещено.

func (*Error) Error

func (e *Error) Error() string

Error возвращает канонический текст сообщения (без кода: код transport передаёт отдельно).

type Field

type Field struct {
	Name string

	// Text — текстовое значение; Num и IsNum задают числовое:
	// поле либо текстовое, либо числовое, одновременно — никогда.
	Text  string
	Num   float64
	IsNum bool
}

Field — поле разбора обозначения: единые имена для одинаковой семантики между системами (material, subclass, junctions, dev_number, letters, series, …) — план 03-data-model.md §1.2, §2; хранится в device_designation_fields как текстовое либо числовое значение.

func NumField

func NumField(name string, num float64) Field

NumField создаёт числовое поле разбора.

func TextField

func TextField(name, text string) Field

TextField создаёт текстовое поле разбора.

func (Field) String

func (f Field) String() string

String возвращает значение поля в текстовом виде (для вывода и тестов).

type Kind

type Kind string

Kind — класс приборов. Реестр синхронизирован с сидами kinds (docs/plan/03-data-model.md §1.1): код ⇄ сиды проверяется пин-тестом. Отображаемое название класса — бандлы internal/i18n (D9): в реестре только коды.

const (
	KindTransistor Kind = "transistor"
	KindDiode      Kind = "diode"
	KindResistor   Kind = "resistor"
	KindCapacitor  Kind = "capacitor"
)

Реестр классов: расширение (тиристоры, оптопары) — новыми кодами здесь и строками сидов; код стабилен (ключ фильтров и REST).

func Kinds

func Kinds() []Kind

Kinds возвращает классы стартового реестра в стабильном порядке.

func (Kind) IsValid

func (k Kind) IsValid() bool

IsValid сообщает, входит ли класс в реестр.

type Material

type Material struct {
	Code string // стабильный код словаря: «ge», «si», …

	// GostLetter и GostDigit — пара равнозначных символов ГОСТ
	// (0 — символ не используется, например у арсенида галлия).
	GostLetter rune
	GostDigit  rune

	// ProLetter — буква материала PRO ELECTRON (0 — нет).
	ProLetter rune
}

Материалы полупроводников: единый словарь значений для сквозного фильтра по полю material между системами gost и pro (docs/plan/03-data-model.md §2.1, §2.4; выверка — docs/plan/07-r1-verification.md §1–2).

Ключ словаря — стабильный код (латиница, D9): значение поля material разбора обозначений, device_designation_fields.text_value и фильтры поиска оперируют кодом; отображаемые названия — бандлы internal/i18n (material.<код>). Равнозначные символы ГОСТ (буква — общегражданское применение, цифра — категории качества ВП/ОС/ОСМ) физически равнозначны: КТ312 и 2Т312 — раздельные записи, подсказка find использует пару символов материала.

func GostMaterialBySymbol

func GostMaterialBySymbol(r rune) (Material, bool)

GostMaterialBySymbol ищет материал по символу ГОСТ — букве (Г, К, А, И, Д, П) или цифре (1–6); используется парсером gost и подсказкой find. Нулевая и отрицательная руна не «находит» материал (в частности, арсенид галлия без символов ГОСТ не выпадает из поиска по невалидной руне).

func MaterialByCode

func MaterialByCode(code string) (Material, bool)

MaterialByCode ищет материал по стабильному коду словаря.

func Materials

func Materials() []Material

Materials возвращает словарь материалов в стабильном порядке.

func ProMaterialByLetter

func ProMaterialByLetter(r rune) (Material, bool)

ProMaterialByLetter ищет материал по первой букве PRO ELECTRON (A, B, C).

type MsgID

type MsgID string

MsgID реестра сообщений. Расширение — новой константой здесь, строкой в registry и форматами en/ru в internal/i18n тем же изменением (полнота закреплена тестом полноты каталога).

const (
	MsgSchemaVersionMismatch  MsgID = "schema_version_mismatch"
	MsgDatabaseNotInitialized MsgID = "database_not_initialized"
	MsgKindNotSupported       MsgID = "kind_not_supported"
	MsgGostSubclassDictSync   MsgID = "gost_subclass_dict_sync"
	MsgKindAmbiguous          MsgID = "kind_ambiguous"
	MsgKindAmbiguousMismatch  MsgID = "kind_ambiguous_mismatch"
	MsgKindRequired           MsgID = "kind_required"

	MsgEmptyDesignation MsgID = "empty_designation"

	MsgScannerExpected   MsgID = "scanner_expected"
	MsgScannerUnexpected MsgID = "scanner_unexpected"
	MsgScannerToken      MsgID = "scanner_token"
	MsgScannerEof        MsgID = "scanner_eof"

	MsgKindUnknown     MsgID = "kind_unknown"
	MsgSystemUnknown   MsgID = "system_unknown"
	MsgUnknownMaterial MsgID = "unknown_material"
	MsgUnknownSubclass MsgID = "unknown_subclass"
	MsgUnknownAdjust   MsgID = "unknown_adjustment"
	MsgUnknownCategory MsgID = "unknown_category"
	MsgPowerSuffix     MsgID = "power_suffix"
	MsgDevNumberZeros  MsgID = "dev_number_leading_zero"
	MsgDevNumberDigits MsgID = "dev_number_digits"

	MsgCanonicalAlphabetMix MsgID = "canonical_alphabet_mix"
	MsgCanonicalBadRune     MsgID = "canonical_bad_rune"
	MsgCanonicalNoLetters   MsgID = "canonical_no_letters"
	MsgKindMismatch         MsgID = "kind_mismatch"
	MsgSystemMismatch       MsgID = "system_mismatch"
	MsgAutodetectFailed     MsgID = "autodetect_failed"
	MsgCapGroupUnknown      MsgID = "cap_group_unknown"

	// Фрагменты грамматик «ожидалось: …» — аргументы scanner-сообщений.
	MsgExpectGostSubclass      MsgID = "expect_gost_subclass"
	MsgExpectGostOptoFunction  MsgID = "expect_gost_opto_function"
	MsgExpectGostDevNumberFull MsgID = "expect_gost_dev_number_full"
	MsgExpectGostDevNumber     MsgID = "expect_gost_dev_number"
	MsgExpectGostMaterial      MsgID = "expect_gost_material"
	MsgExpectDevNumber         MsgID = "expect_dev_number"
	MsgExpectGostFeatureAndDev MsgID = "expect_gost_feature_and_dev"
	MsgExpectGostFeatureDigit  MsgID = "expect_gost_feature_digit"
	MsgExpectGostDevOne        MsgID = "expect_gost_dev_one"
	MsgExpectGostDevOneDigit   MsgID = "expect_gost_dev_one_digit"
	MsgExpectGostFeatureDevRun MsgID = "expect_gost_feature_dev_run"
	MsgExpectGostModification  MsgID = "expect_gost_modification"
	MsgExpectGostChip          MsgID = "expect_gost_chip"
	MsgExpectGostMakerCode     MsgID = "expect_gost_maker_code"
	MsgExpectJedecJunctions    MsgID = "expect_jedec_junctions"
	MsgExpectJedecLetter       MsgID = "expect_jedec_letter"
	MsgExpectJedecNumber       MsgID = "expect_jedec_number"
	MsgExpectJedecNumberNoZero MsgID = "expect_jedec_number_nonzero"
	MsgExpectJisJunctions      MsgID = "expect_jis_junctions"
	MsgExpectJisS              MsgID = "expect_jis_s"
	MsgExpectJisClassLetter    MsgID = "expect_jis_class_letter"
	MsgExpectJisClassRequired  MsgID = "expect_jis_class_required"
	MsgExpectJisNumber         MsgID = "expect_jis_number"
	MsgExpectJisSuffix         MsgID = "expect_jis_suffix"
	MsgExpectJisShortForm      MsgID = "expect_jis_short_form"
	MsgExpectJisShortNumber    MsgID = "expect_jis_short_number"
	MsgExpectProMaterial       MsgID = "expect_pro_material"
	MsgExpectProClassLetter    MsgID = "expect_pro_class_letter"
	MsgExpectProClassTable     MsgID = "expect_pro_class_table"
	MsgExpectProNumber         MsgID = "expect_pro_number"
	MsgExpectProConsumerNumber MsgID = "expect_pro_consumer_number"
	MsgExpectProAnyNumber      MsgID = "expect_pro_any_number"
	MsgExpectProSuffix         MsgID = "expect_pro_suffix"
	MsgExpectResFamilyCS       MsgID = "expect_res_family_cs"
	MsgExpectResFamilyR        MsgID = "expect_res_family_r"
	MsgExpectHyphen            MsgID = "expect_hyphen"
	MsgExpectCapGroup          MsgID = "expect_cap_group"
	MsgExpectCapPrefix         MsgID = "expect_cap_prefix"
	MsgExpectCapSubclassGroup  MsgID = "expect_cap_subclass_group"
	MsgExpectResMaterialGroup6 MsgID = "expect_res_material_group_6"
	MsgExpectResMaterialGroup2 MsgID = "expect_res_material_group_2"

	// Сообщения движка валидации и метасхемы (internal/catalog).
	MsgEngineKindMissing         MsgID = "engine_kind_missing"
	MsgEngineKindNoVariants      MsgID = "engine_kind_no_variants"
	MsgEngineSystemNotApplicable MsgID = "engine_system_not_applicable"
	MsgEngineAttrUnknown         MsgID = "engine_attr_unknown"
	MsgEngineAttrInactive        MsgID = "engine_attr_inactive"
	MsgEngineAttrNotApplicable   MsgID = "engine_attr_not_applicable"
	MsgEngineAttrTextExpected    MsgID = "engine_attr_text_expected"
	MsgEngineAttrTextEmpty       MsgID = "engine_attr_text_empty"
	MsgEngineAttrEnumExpected    MsgID = "engine_attr_enum_expected"
	MsgEngineAttrEnumInvalid     MsgID = "engine_attr_enum_invalid"
	MsgEngineAttrBoolExpected    MsgID = "engine_attr_bool_expected"
	MsgEngineAttrIntExpected     MsgID = "engine_attr_int_expected"
	MsgEngineAttrNumExpected     MsgID = "engine_attr_num_expected"
	MsgEngineAttrWhole           MsgID = "engine_attr_whole"
	MsgEngineAttrPositive        MsgID = "engine_attr_positive"
	MsgEngineParamUnknown        MsgID = "engine_param_unknown"
	MsgEngineParamInactive       MsgID = "engine_param_inactive"
	MsgEngineParamNotApplicable  MsgID = "engine_param_not_applicable"
	MsgEngineParamWrongSection   MsgID = "engine_param_wrong_section"
	MsgEngineParamDuplicate      MsgID = "engine_param_duplicate"
	MsgEngineParamTextEmpty      MsgID = "engine_param_text_empty"
	MsgValueKeyRequired          MsgID = "value_key_required"
	MsgValueKeyForbidden         MsgID = "value_key_forbidden"
	MsgValueKeysPairRequired     MsgID = "value_keys_pair_required"
	MsgValueEnumInvalid          MsgID = "value_enum_invalid"
	MsgValueKeyPositive          MsgID = "value_key_positive"
	MsgValueKeyCeiling           MsgID = "value_key_ceiling"
	MsgValueMinMax               MsgID = "value_min_max"
	MsgCondDuplicate             MsgID = "cond_duplicate"
	MsgCondUnknown               MsgID = "cond_unknown"
	MsgCondPositive              MsgID = "cond_positive"
	MsgCondNotAllowed            MsgID = "cond_not_allowed"
	MsgCondFixed                 MsgID = "cond_fixed"
	MsgCondSetMismatch           MsgID = "cond_set_mismatch"
	MsgRuleYearRange             MsgID = "rule_year_range_value"
	MsgRuleYearOrder             MsgID = "rule_year_order"
	MsgRuleTempPair              MsgID = "rule_temp_pair_order"
	MsgRuleCapCylIncomplete      MsgID = "rule_cap_cyl_incomplete"
	MsgRuleCapFormMix            MsgID = "rule_cap_form_mix"
	MsgRuleCapRectIncomplete     MsgID = "rule_cap_rect_incomplete"
	MsgRuleVariantUnomMissing    MsgID = "rule_variant_unom_missing"
	MsgRuleVariantCnomMissing    MsgID = "rule_variant_cnom_missing"
	MsgRuleVariantUnomDup        MsgID = "rule_variant_unom_dup"
	MsgRuleVariantLabelDup       MsgID = "rule_variant_label_dup"
	MsgRuleVariantPnomMissing    MsgID = "rule_variant_pnom_missing"
	MsgRuleVariantPnomDup        MsgID = "rule_variant_pnom_dup"
	MsgMetaSectionNoCode         MsgID = "meta_section_no_code"
	MsgMetaSectionDupCode        MsgID = "meta_section_dup_code"
	MsgMetaRuleUnknownSection    MsgID = "meta_rule_unknown_section"
	MsgMetaParamValueType        MsgID = "meta_param_value_type"
	MsgMetaParamRuleUnknown      MsgID = "meta_param_rule_unknown"
	MsgMetaCondModeUnknown       MsgID = "meta_cond_mode_unknown"
	MsgMetaAttrValueType         MsgID = "meta_attr_value_type"
	MsgMetaAttrRuleUnknown       MsgID = "meta_attr_rule_unknown"
	MsgMetaSystemRefMissing      MsgID = "meta_system_ref_missing"
	MsgMetaSystemKindMissing     MsgID = "meta_system_kind_missing"
	MsgMetaCondUnitMissing       MsgID = "meta_cond_unit_missing"
	MsgMetaCondCodeReserved      MsgID = "meta_cond_code_reserved"
	MsgMetaGroupNoSection        MsgID = "meta_group_no_section"
	MsgMetaGroupSortNegative     MsgID = "meta_group_sort_negative"
	MsgMetaGroupSectionDup       MsgID = "meta_group_section_dup"
	MsgMetaGroupSectionReserved  MsgID = "meta_group_section_reserved"
	MsgMetaRuleUnknown           MsgID = "meta_rule_unknown"
	MsgMetaKindRuleKindMissing   MsgID = "meta_kind_rule_kind_missing"
	MsgMetaKindRuleUnknown       MsgID = "meta_kind_rule_unknown"
	MsgMetaKindRuleRowMissing    MsgID = "meta_kind_rule_row_missing"
	MsgMetaKindRuleNotDevice     MsgID = "meta_kind_rule_not_device"
	MsgMetaParamGroupMissing     MsgID = "meta_param_group_missing"
	MsgMetaParamUnitMissing      MsgID = "meta_param_unit_missing"
	MsgMetaParamUnitForbidden    MsgID = "meta_param_unit_forbidden"
	MsgMetaParamEnumRequired     MsgID = "meta_param_enum_required"
	MsgMetaParamEnumOnly         MsgID = "meta_param_enum_only"
	MsgMetaParamCeiling          MsgID = "meta_param_ceiling"
	MsgMetaParamSortNegative     MsgID = "meta_param_sort_negative"
	MsgMetaParamKindMissing      MsgID = "meta_param_kind_missing"
	MsgMetaParamRuleRowMissing   MsgID = "meta_param_rule_row_missing"
	MsgMetaParamRuleWrongLevel   MsgID = "meta_param_rule_wrong_level"
	MsgMetaCondSetEmpty          MsgID = "meta_cond_set_empty"
	MsgMetaCondMissing           MsgID = "meta_cond_missing"
	MsgMetaCondFixedOptional     MsgID = "meta_cond_fixed_optional"
	MsgMetaAttrUnitMissing       MsgID = "meta_attr_unit_missing"
	MsgMetaAttrUnitForbidden     MsgID = "meta_attr_unit_forbidden"
	MsgMetaAttrEnumRequired      MsgID = "meta_attr_enum_required"
	MsgMetaAttrEnumOnly          MsgID = "meta_attr_enum_only"
	MsgMetaAttrSortNegative      MsgID = "meta_attr_sort_negative"
	MsgMetaAttrKindMissing       MsgID = "meta_attr_kind_missing"
	MsgMetaAttrRuleRowMissing    MsgID = "meta_attr_rule_row_missing"
	MsgMetaAttrRuleWrongLevel    MsgID = "meta_attr_rule_wrong_level"

	// Сообщения формата наполнения (internal/importer).
	MsgImportRootNotObject            MsgID = "import_root_not_object"
	MsgImportRootUnknownKey           MsgID = "import_root_unknown_key"
	MsgImportRootSectionArray         MsgID = "import_root_section_array"
	MsgImportRecordEmptyName          MsgID = "import_record_empty_name"
	MsgImportRecordBadValue           MsgID = "import_record_bad_value"
	MsgImportRecordNameRequired       MsgID = "import_record_name_required"
	MsgImportRecordNameString         MsgID = "import_record_name_string"
	MsgImportRecordUnknownField       MsgID = "import_record_unknown_field"
	MsgImportRecordSystemString       MsgID = "import_record_system_string"
	MsgImportRecordSystemUnknown      MsgID = "import_record_system_unknown"
	MsgImportFieldsObject             MsgID = "import_fields_object"
	MsgImportFieldUnknown             MsgID = "import_field_unknown"
	MsgImportFieldString              MsgID = "import_field_string"
	MsgImportFieldNumber              MsgID = "import_field_number"
	MsgImportSectionArray             MsgID = "import_section_array"
	MsgImportManufacturersArray       MsgID = "import_manufacturers_array"
	MsgImportManufacturerItem         MsgID = "import_manufacturer_item"
	MsgImportVariantsArray            MsgID = "import_variants_array"
	MsgImportAnalogsArray             MsgID = "import_analogs_array"
	MsgImportAttributesObject         MsgID = "import_attributes_object"
	MsgImportAttrNumber               MsgID = "import_attr_number"
	MsgImportAttrBadValue             MsgID = "import_attr_bad_value"
	MsgImportWhereSection             MsgID = "import_where_section"
	MsgImportValueObject              MsgID = "import_value_object"
	MsgImportValueParameterString     MsgID = "import_value_parameter_string"
	MsgImportValueTextString          MsgID = "import_value_text_string"
	MsgImportValueKeyNumber           MsgID = "import_value_key_number"
	MsgImportValueUnknownKey          MsgID = "import_value_unknown_key"
	MsgImportValueParameterRequired   MsgID = "import_value_parameter_required"
	MsgImportVariantLabelString       MsgID = "import_variant_label_string"
	MsgImportVariantUnknownField      MsgID = "import_variant_unknown_field"
	MsgImportVariantSectionArray      MsgID = "import_variant_section_array"
	MsgImportAnalogNameRequired       MsgID = "import_analog_name_required"
	MsgImportAnalogNoteString         MsgID = "import_analog_note_string"
	MsgImportAnalogUnknownField       MsgID = "import_analog_unknown_field"
	MsgImportAnalogItem               MsgID = "import_analog_item"
	MsgImportNdjsonLineObject         MsgID = "import_ndjson_line_object"
	MsgImportNdjsonCatalogOrder       MsgID = "import_ndjson_catalog_order"
	MsgImportNdjsonClassKey           MsgID = "import_ndjson_class_key"
	MsgImportNdjsonWrapperSingle      MsgID = "import_ndjson_wrapper_single"
	MsgImportCatalogObject            MsgID = "import_catalog_object"
	MsgImportCatalogSubsection        MsgID = "import_catalog_subsection"
	MsgImportCatalogRowsArray         MsgID = "import_catalog_rows_array"
	MsgImportCatalogRowObject         MsgID = "import_catalog_row_object"
	MsgImportCatalogUnknownField      MsgID = "import_catalog_unknown_field"
	MsgImportCatalogFieldRequired     MsgID = "import_catalog_field_required"
	MsgImportCatalogFieldString       MsgID = "import_catalog_field_string"
	MsgImportCatalogFieldNumber       MsgID = "import_catalog_field_number"
	MsgImportCatalogFieldInteger      MsgID = "import_catalog_field_integer"
	MsgImportCatalogFieldBool         MsgID = "import_catalog_field_bool"
	MsgImportCatalogFieldStrings      MsgID = "import_catalog_field_strings"
	MsgImportCatalogItemString        MsgID = "import_catalog_item_string"
	MsgImportCatalogParamActiveBool   MsgID = "import_catalog_param_active_bool"
	MsgImportCatalogAttrActiveBool    MsgID = "import_catalog_attr_active_bool"
	MsgImportCatalogCondsetsArray     MsgID = "import_catalog_condsets_array"
	MsgImportCatalogCondsetObject     MsgID = "import_catalog_condset_object"
	MsgImportCatalogCondsetItems      MsgID = "import_catalog_condset_items"
	MsgImportCatalogCondsetItemObject MsgID = "import_catalog_condset_item_object"
	MsgImportCatalogCondsetEmpty      MsgID = "import_catalog_condset_empty"
	MsgImportCatalogRow               MsgID = "import_catalog_row"
	MsgImportCatalogRowCode           MsgID = "import_catalog_row_code"
	MsgImportFormatUnknown            MsgID = "import_format_unknown"
	MsgImportFormatByExt              MsgID = "import_format_by_ext"
	MsgImportFormatLineOnly           MsgID = "import_format_line_only"
	MsgImportYamlNonFinite            MsgID = "import_yaml_non_finite"
	MsgImportYamlMultiDoc             MsgID = "import_yaml_multi_doc"
	MsgImportYamlAliasCycle           MsgID = "import_yaml_alias_cycle"
	MsgImportYamlAliasUnknown         MsgID = "import_yaml_alias_unknown"
	MsgImportYamlKeyInvalid           MsgID = "import_yaml_key_invalid"
	MsgImportYamlNodeUnsupported      MsgID = "import_yaml_node_unsupported"
	MsgImportNdjsonLineError          MsgID = "import_ndjson_line_error"
	MsgImportSyntaxError              MsgID = "import_syntax_error"
	MsgImportCatalogRecordsMixed      MsgID = "import_catalog_records_mixed"
	MsgImportDuplicateKey             MsgID = "import_duplicate_key"
	MsgImportUnexpectedToken          MsgID = "import_unexpected_token"
	MsgImportIssueRecordLine          MsgID = "import_issue_record_line"
	MsgImportIssueRecord              MsgID = "import_issue_record"
	MsgImportIssueLine                MsgID = "import_issue_line"
	MsgImportIssueNo                  MsgID = "import_issue_no"
	MsgImportValueKindNumber          MsgID = "import_value_kind_number"
	MsgImportValueKindString          MsgID = "import_value_kind_string"
	MsgImportValueKindArray           MsgID = "import_value_kind_array"
	MsgImportValueKindObject          MsgID = "import_value_kind_object"
	MsgImportValueKindBool            MsgID = "import_value_kind_bool"
	MsgImportValueKindOther           MsgID = "import_value_kind_other"

	// Итог прогона и позиционные префиксы исполнений/аналогов.
	MsgImportSummary          MsgID = "import_summary"
	MsgImportSummaryRejected  MsgID = "import_summary_rejected"
	MsgImportSummaryCatalog   MsgID = "import_summary_catalog"
	MsgImportWhereVariant     MsgID = "import_where_variant"
	MsgImportWhereAnalog      MsgID = "import_where_analog"
	MsgImportWhereValue       MsgID = "import_where_value"
	MsgImportCatalogPlain     MsgID = "import_catalog_object_plain"
	MsgImportNdjsonSubsection MsgID = "import_ndjson_subsection_array"

	// Сообщения хранилища (internal/storage) и сидирования.
	MsgStorageDsnMissing         MsgID = "storage_dsn_missing"
	MsgStorageDialectUnknown     MsgID = "storage_dialect_unknown"
	MsgStorageOpen               MsgID = "storage_open_failed"
	MsgStorageDDL                MsgID = "storage_ddl_failed"
	MsgStorageCatalogWrite       MsgID = "storage_catalog_write_failed"
	MsgStorageRereadMissing      MsgID = "storage_reread_missing"
	MsgStorageRevisionRowMissing MsgID = "storage_revision_row_missing"
	MsgStoragePageInvalid        MsgID = "storage_page_invalid"
	MsgStorageCommitReadOnly     MsgID = "storage_commit_read_only"
	MsgSeedFailed                MsgID = "seed_failed"

	// Сообщения сервисного слоя (internal/service).
	MsgSvcRecordNameMissing     MsgID = "svc_record_name_missing"
	MsgSvcRecordAlreadyExists   MsgID = "svc_record_already_exists"
	MsgSvcSectionUnknown        MsgID = "svc_section_unknown"
	MsgSvcSectionMissing        MsgID = "svc_section_missing"
	MsgSvcSectionDuplicate      MsgID = "svc_section_duplicate"
	MsgSvcAttrCodeMissing       MsgID = "svc_attr_code_missing"
	MsgSvcAttrDuplicate         MsgID = "svc_attr_duplicate"
	MsgSvcManufacturerEmpty     MsgID = "svc_manufacturer_empty"
	MsgSvcManufacturerDuplicate MsgID = "svc_manufacturer_duplicate"
	MsgSvcAnalogEmpty           MsgID = "svc_analog_empty"
	MsgSvcAnalogSelf            MsgID = "svc_analog_self"
	MsgSvcAnalogDuplicate       MsgID = "svc_analog_duplicate"
	MsgSvcAnalogNotFound        MsgID = "svc_analog_not_found"
	MsgSvcFilterFieldMissing    MsgID = "svc_designation_filter_field_missing"
	MsgSvcFilterOpUnknown       MsgID = "svc_filter_op_unknown"
	MsgSvcSearchFieldUnknown    MsgID = "svc_search_field_unknown"
	MsgSvcFilterAttrText        MsgID = "svc_filter_attr_text_expected"
	MsgSvcFilterAttrNumber      MsgID = "svc_filter_attr_number_expected"
	MsgSvcFilterParamSet        MsgID = "svc_filter_param_value_missing"
	MsgSvcFilterParamText       MsgID = "svc_filter_param_text_expected"
	MsgSvcFilterParamNumber     MsgID = "svc_filter_param_number_expected"
	MsgSvcFieldDuplicate        MsgID = "svc_field_duplicate"
	MsgSvcFieldUnknown          MsgID = "svc_field_unknown"
	MsgSvcFieldParserOwned      MsgID = "svc_field_parser_owned"
	MsgSvcFieldNotApplicable    MsgID = "svc_field_not_applicable"
	MsgSvcFieldAssemblyRange    MsgID = "svc_field_assembly_range"
	MsgSvcFieldTextExpected     MsgID = "svc_field_text_expected"
	MsgSvcFieldDevNumber        MsgID = "svc_field_dev_number"

	// Транспортные сообщения REST (internal/httpapi).
	MsgApiRouteNotFound       MsgID = "api_route_not_found"
	MsgApiMethodNotAllowed    MsgID = "api_method_not_allowed"
	MsgApiPanic               MsgID = "api_panic"
	MsgApiBodyTooLarge        MsgID = "api_body_too_large"
	MsgApiBodyRead            MsgID = "api_body_read"
	MsgApiCardNotFound        MsgID = "api_card_not_found"
	MsgApiIdNotFound          MsgID = "api_id_not_found"
	MsgApiAlreadyExists       MsgID = "api_already_exists"
	MsgApiDesignationMismatch MsgID = "api_designation_mismatch"
	MsgApiBadID               MsgID = "api_bad_id"
	MsgApiQMissing            MsgID = "api_q_missing"
	MsgApiQueryInvalid        MsgID = "api_query_invalid"
	MsgApiLimitRange          MsgID = "api_limit_range"
	MsgApiOffsetNonNeg        MsgID = "api_offset_non_negative"
	MsgApiSortKey             MsgID = "api_sort_key_unknown"
	MsgApiQueryParamUnknown   MsgID = "api_query_param_unknown"
	MsgApiParamDuplicate      MsgID = "api_param_duplicate"
	MsgApiNumberParam         MsgID = "api_number_param"
	MsgApiBoolAttrFilter      MsgID = "api_bool_attr_filter"
	MsgInternalError          MsgID = "internal_error"

	// Интерфейсные строки CLI (internal/cli).
	MsgCliUnknownCommand    MsgID = "cli_unknown_command"
	MsgCliOptionsAfterCmd   MsgID = "cli_options_after_command"
	MsgCliDsnDialect        MsgID = "cli_dsn_dialect_mismatch"
	MsgCliArgCount          MsgID = "cli_arg_count"
	MsgCliHelpArgs          MsgID = "cli_help_args"
	MsgCliUnknownFlag       MsgID = "cli_unknown_flag"
	MsgCliFlagValueRequired MsgID = "cli_flag_value_required"
	MsgCliFlagNoValue       MsgID = "cli_flag_no_value"
	MsgCliLangInvalid       MsgID = "cli_lang_invalid"
	MsgCliFlagNonNegative   MsgID = "cli_flag_non_negative"
	MsgCliFlagNumber        MsgID = "cli_flag_number"
	MsgCliUnknownFlagSet    MsgID = "cli_unknown_flag_set"
	MsgCliDialectUnknown    MsgID = "cli_dialect_unknown"
	MsgCliCatalogSubMissing MsgID = "cli_catalog_subcommand_missing"
	MsgCliCatalogExportArgs MsgID = "cli_catalog_export_args"
	MsgCliCatalogImportArgs MsgID = "cli_catalog_import_args"
	MsgCliCatalogListArgs   MsgID = "cli_catalog_list_args"
	MsgCliCatalogSubUnknown MsgID = "cli_catalog_subcommand_unknown"
	MsgCliFileOpen          MsgID = "cli_file_open"
	MsgCliFileWrite         MsgID = "cli_file_write"
	MsgCliErrPrefix         MsgID = "cli_err_prefix"
	MsgCliUnexpectedPrefix  MsgID = "cli_unexpected_prefix"
	MsgCliDbInitialized     MsgID = "cli_db_initialized"
	MsgCliOutcomeAdded      MsgID = "cli_outcome_added"
	MsgCliOutcomeUpdated    MsgID = "cli_outcome_updated"
	MsgCliOutcomeSkipped    MsgID = "cli_outcome_skipped"
	MsgCliRecordNotFound    MsgID = "cli_record_not_found"
	MsgCliFindSuggestion    MsgID = "cli_find_suggestion"
	MsgCliFindNotFound      MsgID = "cli_find_not_found"
	MsgCliDeleteDryRun      MsgID = "cli_delete_dry_run"
	MsgCliDeleted           MsgID = "cli_deleted"
	MsgCliDryRunHead        MsgID = "cli_dry_run_head"
	MsgCliIssueLine         MsgID = "cli_issue_line"
	MsgCliSystemLine        MsgID = "cli_system_line"
	MsgCliVariantHead       MsgID = "cli_variant_head"
	MsgCliNoLabel           MsgID = "cli_no_label"
	MsgCliManufacturers     MsgID = "cli_manufacturers"
	MsgCliAnalogs           MsgID = "cli_analogs"
	MsgCliBacklinks         MsgID = "cli_backlinks"
	MsgCliParseHead         MsgID = "cli_parse_head"
	MsgCliFieldLine         MsgID = "cli_field_line"
	MsgCliAtLeast           MsgID = "cli_at_least"
	MsgCliAtMost            MsgID = "cli_at_most"
	MsgCliCondAt            MsgID = "cli_cond_at"
	MsgCliAssemblyValue     MsgID = "cli_assembly_value"
	MsgCliDeviceValue       MsgID = "cli_device_value"
	MsgCliHKinds            MsgID = "cli_h_kinds"
	MsgCliHSystems          MsgID = "cli_h_systems"
	MsgCliHGroups           MsgID = "cli_h_groups"
	MsgCliHParams           MsgID = "cli_h_params"
	MsgCliHAttrs            MsgID = "cli_h_attrs"
	MsgCliGroupLine         MsgID = "cli_group_line"
	MsgCliParamLine         MsgID = "cli_param_line"
	MsgCliAttrListLine      MsgID = "cli_attr_list_line"
	MsgCliUsageWord         MsgID = "cli_usage_word"

	// Фрагменты общей справки (catalogctl help и вызов без аргументов):
	// текст собирается генератором internal/cli/help.go по реестру команд
	// (порядок, колонки, перенос строк), строки — каталог сообщений.
	// Структурные: заголовок, заголовки секций, футер о префиксах ошибок
	// (аргументы — вложенные сообщения префиксов).
	MsgCliUsageHeader   MsgID = "cli_usage_header"
	MsgCliUsageCommands MsgID = "cli_usage_commands"
	MsgCliUsageOptions  MsgID = "cli_usage_options"
	MsgCliUsageFooter   MsgID = "cli_usage_footer"

	// Команды: синопсис и описание (list — с перечнем фильтров реестра).
	MsgCliUsageCmdInit              MsgID = "cli_usage_cmd_init"
	MsgCliUsageCmdInitDesc          MsgID = "cli_usage_cmd_init_desc"
	MsgCliUsageCmdParse             MsgID = "cli_usage_cmd_parse"
	MsgCliUsageCmdParseDesc         MsgID = "cli_usage_cmd_parse_desc"
	MsgCliUsageCmdAdd               MsgID = "cli_usage_cmd_add"
	MsgCliUsageCmdAddDesc           MsgID = "cli_usage_cmd_add_desc"
	MsgCliUsageCmdImport            MsgID = "cli_usage_cmd_import"
	MsgCliUsageCmdImportDesc        MsgID = "cli_usage_cmd_import_desc"
	MsgCliUsageCmdList              MsgID = "cli_usage_cmd_list"
	MsgCliUsageCmdListDesc          MsgID = "cli_usage_cmd_list_desc"
	MsgCliUsageCmdInfo              MsgID = "cli_usage_cmd_info"
	MsgCliUsageCmdInfoDesc          MsgID = "cli_usage_cmd_info_desc"
	MsgCliUsageCmdFind              MsgID = "cli_usage_cmd_find"
	MsgCliUsageCmdFindDesc          MsgID = "cli_usage_cmd_find_desc"
	MsgCliUsageCmdDelete            MsgID = "cli_usage_cmd_delete"
	MsgCliUsageCmdDeleteDesc        MsgID = "cli_usage_cmd_delete_desc"
	MsgCliUsageCmdCount             MsgID = "cli_usage_cmd_count"
	MsgCliUsageCmdCountDesc         MsgID = "cli_usage_cmd_count_desc"
	MsgCliUsageCmdExport            MsgID = "cli_usage_cmd_export"
	MsgCliUsageCmdExportDesc        MsgID = "cli_usage_cmd_export_desc"
	MsgCliUsageCmdCatalogExport     MsgID = "cli_usage_cmd_catalog_export"
	MsgCliUsageCmdCatalogExportDesc MsgID = "cli_usage_cmd_catalog_export_desc"
	MsgCliUsageCmdCatalogImport     MsgID = "cli_usage_cmd_catalog_import"
	MsgCliUsageCmdCatalogImportDesc MsgID = "cli_usage_cmd_catalog_import_desc"
	MsgCliUsageCmdCatalogList       MsgID = "cli_usage_cmd_catalog_list"
	MsgCliUsageCmdCatalogListDesc   MsgID = "cli_usage_cmd_catalog_list_desc"
	MsgCliUsageCmdHelp              MsgID = "cli_usage_cmd_help"
	MsgCliUsageCmdHelpDesc          MsgID = "cli_usage_cmd_help_desc"

	// Общие опции: спецификация и описание.
	MsgCliUsageOptDialect     MsgID = "cli_usage_opt_dialect"
	MsgCliUsageOptDialectDesc MsgID = "cli_usage_opt_dialect_desc"
	MsgCliUsageOptDb          MsgID = "cli_usage_opt_db"
	MsgCliUsageOptDbDesc      MsgID = "cli_usage_opt_db_desc"
	MsgCliUsageOptDsn         MsgID = "cli_usage_opt_dsn"
	MsgCliUsageOptDsnDesc     MsgID = "cli_usage_opt_dsn_desc"
	MsgCliUsageOptKind        MsgID = "cli_usage_opt_kind"
	MsgCliUsageOptKindDesc    MsgID = "cli_usage_opt_kind_desc"
	MsgCliUsageOptSystem      MsgID = "cli_usage_opt_system"
	MsgCliUsageOptSystemDesc  MsgID = "cli_usage_opt_system_desc"
	MsgCliUsageOptLang        MsgID = "cli_usage_opt_lang"
	MsgCliUsageOptLangDesc    MsgID = "cli_usage_opt_lang_desc"
	MsgCliUsageOptDryRun      MsgID = "cli_usage_opt_dry_run"
	MsgCliUsageOptDryRunDesc  MsgID = "cli_usage_opt_dry_run_desc"
	MsgCliUsageOptFormat      MsgID = "cli_usage_opt_format"
	MsgCliUsageOptFormatDesc  MsgID = "cli_usage_opt_format_desc"

	// Строка использования команды (карточка help <команда> и ошибки
	// числа аргументов): путь и позиционные аргументы, %[1]s — полный
	// перечень флагов реестра команды («[--имя] …», генерируется).
	MsgCliUseInit          MsgID = "cli_use_init"
	MsgCliUseParse         MsgID = "cli_use_parse"
	MsgCliUseAdd           MsgID = "cli_use_add"
	MsgCliUseImport        MsgID = "cli_use_import"
	MsgCliUseList          MsgID = "cli_use_list"
	MsgCliUseInfo          MsgID = "cli_use_info"
	MsgCliUseFind          MsgID = "cli_use_find"
	MsgCliUseDelete        MsgID = "cli_use_delete"
	MsgCliUseCount         MsgID = "cli_use_count"
	MsgCliUseExport        MsgID = "cli_use_export"
	MsgCliUseCatalogExport MsgID = "cli_use_catalog_export"
	MsgCliUseCatalogImport MsgID = "cli_use_catalog_import"
	MsgCliUseCatalogList   MsgID = "cli_use_catalog_list"
	MsgCliUseVersion       MsgID = "cli_use_version"
	MsgCliUseHelp          MsgID = "cli_use_help"

	// Карточка команды: заголовок секции опций.
	MsgCliUsageFlags MsgID = "cli_usage_flags"

	// Фильтры list (спецификации и описания опций карточек и общей
	// справки).
	MsgCliUsageOptMaterial       MsgID = "cli_usage_opt_material"
	MsgCliUsageOptMaterialDesc   MsgID = "cli_usage_opt_material_desc"
	MsgCliUsageOptSubclass       MsgID = "cli_usage_opt_subclass"
	MsgCliUsageOptSubclassDesc   MsgID = "cli_usage_opt_subclass_desc"
	MsgCliUsageOptAdjustment     MsgID = "cli_usage_opt_adjustment"
	MsgCliUsageOptAdjustmentDesc MsgID = "cli_usage_opt_adjustment_desc"
	MsgCliUsageOptCategory       MsgID = "cli_usage_opt_category"
	MsgCliUsageOptCategoryDesc   MsgID = "cli_usage_opt_category_desc"
	MsgCliUsageOptJunctions      MsgID = "cli_usage_opt_junctions"
	MsgCliUsageOptJunctionsDesc  MsgID = "cli_usage_opt_junctions_desc"
	MsgCliUsageOptGroup          MsgID = "cli_usage_opt_group"
	MsgCliUsageOptGroupDesc      MsgID = "cli_usage_opt_group_desc"
	MsgCliUsageOptSeries         MsgID = "cli_usage_opt_series"
	MsgCliUsageOptSeriesDesc     MsgID = "cli_usage_opt_series_desc"
	MsgCliUsageOptNumber         MsgID = "cli_usage_opt_number"
	MsgCliUsageOptNumberDesc     MsgID = "cli_usage_opt_number_desc"
	MsgCliUsageOptLetters        MsgID = "cli_usage_opt_letters"
	MsgCliUsageOptLettersDesc    MsgID = "cli_usage_opt_letters_desc"
	MsgCliUsageOptQ              MsgID = "cli_usage_opt_q"
	MsgCliUsageOptQDesc          MsgID = "cli_usage_opt_q_desc"
	MsgCliUsageOptLimit          MsgID = "cli_usage_opt_limit"
	MsgCliUsageOptLimitDesc      MsgID = "cli_usage_opt_limit_desc"
	MsgCliUsageOptOffset         MsgID = "cli_usage_opt_offset"
	MsgCliUsageOptOffsetDesc     MsgID = "cli_usage_opt_offset_desc"

	// Примеры и примечание об позиции опций общей справки.
	MsgCliUsageExamples MsgID = "cli_usage_examples"
	MsgCliUsageExInit   MsgID = "cli_usage_ex_init"
	MsgCliUsageExImport MsgID = "cli_usage_ex_import"
	MsgCliUsageExList   MsgID = "cli_usage_ex_list"
	MsgCliUsageExInfo   MsgID = "cli_usage_ex_info"
	MsgCliUsagePosition MsgID = "cli_usage_position"

	// Команда version.
	MsgCliUsageCmdVersion     MsgID = "cli_usage_cmd_version"
	MsgCliUsageCmdVersionDesc MsgID = "cli_usage_cmd_version_desc"
	MsgCliVersion             MsgID = "cli_version"
)

func MsgIDs

func MsgIDs() []MsgID

MsgIDs — все MsgID реестра (для теста полноты каталога).

type ParsedDesignation

type ParsedDesignation struct {
	Kind        Kind
	System      System
	Designation string
	Fields      []Field
}

ParsedDesignation — результат разбора: класс, система, каноническая строка (точный ключ записи внутри класса) и поля разбора.

func ParseDesignation

func ParseDesignation(text string) (ParsedDesignation, error)

ParseDesignation разбирает обозначение с автодетектом класса и системы (порядок попыток — план 03 §2.4): полупроводник gost → pro → jedec → jis → резистор gost/ost → конденсатор gost. Системы без разбора (other) автодетекта не имеют — требуют явного указания.

func ParseDesignationForSystem

func ParseDesignationForSystem(text string, system System, kind Kind) (ParsedDesignation, error)

ParseDesignationForSystem разбирает обозначение с явной системой (и опционально классом — переопределяет автодетект, обязателен для other). Пустая система — автодетект; несоответствие обозначения системе — ошибка designation_mismatch.

func (ParsedDesignation) FieldByName

func (p ParsedDesignation) FieldByName(name string) (Field, bool)

FieldByName ищет поле разбора по коду.

func (ParsedDesignation) String

func (p ParsedDesignation) String() string

String — компактная сериализация полей разбора для вывода и golden-тестов: поле=значение; …

type Subclass

type Subclass struct {
	Code string // стабильный код словаря: «bjt», «zener», …

	// GostLetter — буква подкласса ГОСТ 10862-64 / ГОСТ Р 71055-2023
	// (элемент 2, поддерживаемые классами модуля однобуквенные формы;
	// 0 — буква не используется).
	GostLetter rune

	// ProLetter — вторая буква PRO ELECTRON (0 — не используется).
	ProLetter rune

	// JisLetter — буква класса JIS C 7012 (0 — не используется).
	JisLetter rune
}

Подклассы приборов: единый словарь значений для сквозного фильтра по полю subclass между системами обозначений (docs/plan/03-data-model.md §2).

Ключ словаря — стабильный код (латиница, D9): значение поля subclass разбора обозначений, device_designation_fields.text_value и фильтры поиска оперируют кодом; отображаемые названия — бандлы internal/i18n (subclass.<код>). Коды — наименьший общий знаменатель систем: более тонкие различия (p-n-p/n-p-n, ВЧ/НЧ, маломощный/мощный) кодируются атрибутами (structure) и параметрами, словарь их не дублирует. Отображения букв — многие-к-одному (jis C и gost Т → bjt), обратных расщеплений нет. Гранулярность и источники отображений — таблицы парсеров (parse_gost.go, parse_pro.go, parse_jis.go; выверка — docs/plan/07-r1-verification.md §4).

Подкласс Ф ГОСТ (фотодиод/фототранзистор) неоднозначен по классу: код photo един для обоих — класс записи разрешается явным ключом kind, как и в грамматике парсера.

func SubclassByCode

func SubclassByCode(code string) (Subclass, bool)

SubclassByCode ищет подкласс по стабильному коду словаря.

func Subclasses

func Subclasses() []Subclass

Subclasses возвращает словарь подклассов в стабильном порядке.

type System

type System string

System — система условных обозначений. Реестр синхронизирован с сидами designation_systems (docs/plan/03-data-model.md §1.2): код ⇄ сиды — пин-тест. Отображаемые имя и пояснение — бандлы internal/i18n (D9): в реестре только коды.

const (
	SystemGost  System = "gost"
	SystemOst   System = "ost"
	SystemPro   System = "pro"
	SystemJedec System = "jedec"
	SystemJis   System = "jis"
	SystemOther System = "other"
)

Реестр систем обозначений: gost покрывает полупроводники (ГОСТ 10862-64 и преемники до ГОСТ Р 71055-2023), резисторы (ГОСТ 3453-68) и конденсаторы (единая система, действующая кодификация — ГОСТ Р 57440-2017); грамматика каждой предметной области — свой парсер.

func Systems

func Systems() []System

Systems возвращает системы обозначений стартового реестра в стабильном порядке.

func SystemsForKind

func SystemsForKind(k Kind) []System

SystemsForKind возвращает системы, применимые к классу, в стабильном порядке.

func (System) IsValid

func (s System) IsValid() bool

IsValid сообщает, входит ли система в реестр.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL