domain

package
v0.3.0 Latest Latest
Warning

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

Go to latest
Published: Nov 2, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Overview

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

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

Index

Constants

View Source
const FieldBase = "base"

FieldBase — код производного поля разбора «базовое обозначение (тип)»: каноническая строка без буквы классификации и хвостовых элементов (план 03 §2.6). Продукт парсеров строгих систем; для записей other вычисляется сервисным слоем по явным полям series/dev_number; в секции fields формата наполнения не задаётся (производное).

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"
	CodeUnknownSource          Code = "unknown_source"
	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"
	KindRelay      Kind = "relay"
)

Реестр классов: расширение — новыми кодами здесь и строками сидов; код стабилен (ключ фильтров и REST). Реле — только система other (разбора нет, 03-data-model.md §1.1).

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"
	MsgEngineAttrTextsExpected        MsgID = "engine_attr_texts_expected"
	MsgEngineAttrTextsEmpty           MsgID = "engine_attr_texts_empty"
	MsgEngineAttrTextsElementEmpty    MsgID = "engine_attr_texts_element_empty"
	MsgEngineAttrTextsDuplicate       MsgID = "engine_attr_texts_duplicate"
	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"
	MsgValueBoundRequired             MsgID = "value_bound_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"
	MsgRuleVariantVnomMissing         MsgID = "rule_variant_vnom_missing"
	MsgRuleVariantCnomMissing         MsgID = "rule_variant_cnom_missing"
	MsgRuleVariantCellDup             MsgID = "rule_variant_cell_dup"
	MsgRuleVariantLabelDup            MsgID = "rule_variant_label_dup"
	MsgRuleVariantPnomMissing         MsgID = "rule_variant_pnom_missing"
	MsgRuleVariantPnomDup             MsgID = "rule_variant_pnom_dup"
	MsgRuleRelayVariantRcoilMissing   MsgID = "rule_variant_rcoil_missing"
	MsgRuleRelayVariantNominalMissing MsgID = "rule_variant_nominal_missing"
	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"
	MsgImportAttrElementString        MsgID = "import_attr_element_string"
	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"
	MsgImportVariantAttributesObject  MsgID = "import_variant_attributes_object"
	MsgImportVariantAttrNumber        MsgID = "import_variant_attr_number"
	MsgImportVariantAttrBadValue      MsgID = "import_variant_attr_bad_value"
	MsgImportVariantAttrElementString MsgID = "import_variant_attr_element_string"
	MsgImportAnalogNameRequired       MsgID = "import_analog_name_required"
	MsgImportAnalogNoteString         MsgID = "import_analog_note_string"
	MsgImportAnalogUnknownField       MsgID = "import_analog_unknown_field"
	MsgImportAnalogItem               MsgID = "import_analog_item"
	MsgImportSynonymsArray            MsgID = "import_synonyms_array"
	MsgImportSynonymItem              MsgID = "import_synonym_item"
	MsgImportSynonymNameRequired      MsgID = "import_synonym_name_required"
	MsgImportSynonymUnknownField      MsgID = "import_synonym_unknown_field"
	MsgImportSynonymNoteString        MsgID = "import_synonym_note_string"
	MsgImportSynonymYearInt           MsgID = "import_synonym_year_int"
	MsgImportSourcesArray             MsgID = "import_sources_array"
	MsgImportSourcesObject            MsgID = "import_sources_object"
	MsgImportSourcesUnknownField      MsgID = "import_sources_unknown_field"
	MsgImportSourcesFieldRequired     MsgID = "import_sources_field_required"
	MsgImportSourcesFieldString       MsgID = "import_sources_field_string"
	MsgImportSourcesFieldInteger      MsgID = "import_sources_field_integer"
	MsgImportSourcesFieldStrings      MsgID = "import_sources_field_strings"
	MsgImportSourcesItemString        MsgID = "import_sources_item_string"
	MsgImportRecordSourcesArray       MsgID = "import_record_sources_array"
	MsgImportRecordSourceItem         MsgID = "import_record_source_item"
	MsgImportRecordSourceCodeRequired MsgID = "import_record_source_code_required"
	MsgImportRecordSourceUnknownField MsgID = "import_record_source_unknown_field"
	MsgImportRecordSourceNoteString   MsgID = "import_record_source_note_string"
	MsgImportNdjsonLineObject         MsgID = "import_ndjson_line_object"
	MsgImportNdjsonCatalogOrder       MsgID = "import_ndjson_catalog_order"
	MsgImportNdjsonSourcesOrder       MsgID = "import_ndjson_sources_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"
	MsgImportCatalogSourcesMixed      MsgID = "import_catalog_sources_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"
	MsgImportSummarySources   MsgID = "import_summary_sources"
	MsgImportWhereVariant     MsgID = "import_where_variant"
	MsgImportWhereAnalog      MsgID = "import_where_analog"
	MsgImportWhereSynonym     MsgID = "import_where_synonym"
	MsgImportWhereSource      MsgID = "import_where_source"
	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"
	MsgSvcSynonymEmpty          MsgID = "svc_synonym_empty"
	MsgSvcSynonymSelf           MsgID = "svc_synonym_self"
	MsgSvcSynonymDuplicate      MsgID = "svc_synonym_duplicate"
	MsgSvcSynonymConflictRecord MsgID = "svc_synonym_conflict_record"
	MsgSvcSynonymConflictOther  MsgID = "svc_synonym_conflict_other"
	MsgSvcSynonymOwnerConflict  MsgID = "svc_synonym_owner_conflict"
	MsgSvcSynonymYearOrder      MsgID = "svc_synonym_year_order"
	MsgSvcSynonymYearRange      MsgID = "svc_synonym_year_range"
	MsgSvcSourceCodeMissing     MsgID = "svc_source_code_missing"
	MsgSvcSourceCodeCharset     MsgID = "svc_source_code_charset"
	MsgSvcSourceTitleMissing    MsgID = "svc_source_title_missing"
	MsgSvcSourceTypeMissing     MsgID = "svc_source_type_missing"
	MsgSvcSourceTypeUnknown     MsgID = "svc_source_type_unknown"
	MsgSvcSourceYearRange       MsgID = "svc_source_year_range"
	MsgSvcSourceListElementBad  MsgID = "svc_source_list_element_bad"
	MsgSvcSourceListDuplicate   MsgID = "svc_source_list_duplicate"
	MsgSvcSourceDuplicateCode   MsgID = "svc_source_duplicate_code"
	MsgSvcDeviceSourceEmpty     MsgID = "svc_device_source_empty"
	MsgSvcDeviceSourceDuplicate MsgID = "svc_device_source_duplicate"
	MsgSvcDeviceSourceNotFound  MsgID = "svc_device_source_not_found"
	MsgSvcFilterFieldMissing    MsgID = "svc_designation_filter_field_missing"
	MsgSvcFilterOpUnknown       MsgID = "svc_filter_op_unknown"
	MsgSvcSearchFieldUnknown    MsgID = "svc_search_field_unknown"
	MsgSvcSearchIDMax           MsgID = "svc_search_id_max"
	MsgSvcSearchIDPositive      MsgID = "svc_search_id_positive"
	MsgSvcSearchIDDuplicate     MsgID = "svc_search_id_duplicate"
	MsgSvcSearchValueDuplicate  MsgID = "svc_search_value_duplicate"
	MsgSvcSearchValuesMax       MsgID = "svc_search_values_max"
	MsgSvcSearchValuesDuplicate MsgID = "svc_search_values_duplicate"
	MsgSvcValuesBoolAttr        MsgID = "svc_values_attr_bool"
	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"
	MsgSvcSortParamNumber       MsgID = "svc_sort_param_number_expected"
	MsgSvcFieldDuplicate        MsgID = "svc_field_duplicate"
	MsgSvcFieldUnknown          MsgID = "svc_field_unknown"
	MsgSvcFieldParserOwned      MsgID = "svc_field_parser_owned"
	MsgSvcFieldBaseDerived      MsgID = "svc_field_base_derived"
	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"
	MsgApiImportBodyTooLarge  MsgID = "api_import_body_too_large"
	MsgApiImportCTMissing     MsgID = "api_import_content_type_missing"
	MsgApiImportCTUnknown     MsgID = "api_import_content_type_unknown"
	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"
	MsgApiDesignationMissing  MsgID = "api_designation_missing"
	MsgApiQueryInvalid        MsgID = "api_query_invalid"
	MsgApiLimitRange          MsgID = "api_limit_range"
	MsgApiOffsetNonNeg        MsgID = "api_offset_non_negative"
	MsgApiAfterNonNeg         MsgID = "api_after_non_negative"
	MsgApiSortKey             MsgID = "api_sort_key_unknown"
	MsgApiQueryParamUnknown   MsgID = "api_query_param_unknown"
	MsgApiParamDuplicate      MsgID = "api_param_duplicate"
	MsgApiNumberParam         MsgID = "api_number_param"
	MsgApiBoolParam           MsgID = "api_bool_param"
	MsgApiBoolAttrFilter      MsgID = "api_bool_attr_filter"
	MsgApiIdParam             MsgID = "api_id_param"
	MsgApiValuesCode          MsgID = "api_values_code"
	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"
	MsgCliListArg           MsgID = "cli_list_arg"
	MsgCliListAllFlags      MsgID = "cli_list_all_flags"
	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"
	MsgCliFindType          MsgID = "cli_find_type"
	MsgCliFindSynonym       MsgID = "cli_find_synonym"
	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"
	MsgCliTypeGroupHead     MsgID = "cli_type_group_head"
	MsgCliNoLabel           MsgID = "cli_no_label"
	MsgCliManufacturers     MsgID = "cli_manufacturers"
	MsgCliAnalogs           MsgID = "cli_analogs"
	MsgCliBacklinks         MsgID = "cli_backlinks"
	MsgCliSynonyms          MsgID = "cli_synonyms"
	MsgCliSources           MsgID = "cli_sources"
	MsgCliYearSince         MsgID = "cli_year_since"
	MsgCliYearUntil         MsgID = "cli_year_until"
	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"
	MsgCliUsageOptConstruction     MsgID = "cli_usage_opt_construction"
	MsgCliUsageOptConstructionDesc MsgID = "cli_usage_opt_construction_desc"
	MsgCliUsageOptBase             MsgID = "cli_usage_opt_base"
	MsgCliUsageOptBaseDesc         MsgID = "cli_usage_opt_base_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 ParseDesignationCandidates added in v0.0.5

func ParseDesignationCandidates(text string, kind Kind) ([]ParsedDesignation, error)

ParseDesignationCandidates перечисляет все успешные разборы обозначения строгими системами в фиксированном порядке автодетекта — эквивалент «конфиденса» строгих грамматик (числовой уверенности нет): перечень пар класс/система без дублей; первый элемент совпадает с результатом ParseDesignation при той же подсказке kind (подсказка разрешает неоднозначный класс Ф грамматики gost, как в автодетекте). Контракт ошибок общий с автодетектом: ошибки канонизации и вердикты isVerdictError возвращаются как есть (вердикт прерывает перебор), ни один парсер не принял — autodetect_failed.

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