|
| 1 | +# Хелперы для своего типа (`PCSingle_*` / `PCGet_*`) |
| 2 | + |
| 3 | +Для работы типа контроллеру достаточно колбека чтения. Но по конвенции к типу |
| 4 | +пишут пару хелперов-обёрток, чтобы потребителю было удобно читать значение — как |
| 5 | +у встроенных типов: |
| 6 | + |
| 7 | +- `PCSingle_*` — прочитать **одно** значение типа прямо из JSON, без параметра; |
| 8 | +- `PCGet_*` — прочитать готовое значение из **результата** (`Trie`). |
| 9 | + |
| 10 | +## Процесс |
| 11 | + |
| 12 | +1. **Определи вид значения.** Что колбек пишет в `Trie`: число/`cell` или строку. |
| 13 | + Для хендлеров (напр. `Regex`) — тоже `cell`, с приведением типа. |
| 14 | +2. **`PCSingle_*`** (сырое значение) — обёртка над `PCSingle_Cell` (число) или |
| 15 | + `PCSingle_Str` (строка). |
| 16 | +3. **`PCSingle_Obj*`** (из объекта по ключу) — обёртка над `PCSingle_ObjCell` / |
| 17 | + `PCSingle_ObjStr`; принимает `key`, `dotNot`, `orFail`. |
| 18 | +4. **`PCGet_*`** (из результата) — обёртка над `PCGet_Cell` / `PCGet_Str`; для |
| 19 | + строки добавь `i`-вариант. |
| 20 | +5. **Положи хелперы в публичный `.inc` плагина**, если API типа доступно другим |
| 21 | + плагинам. |
| 22 | + |
| 23 | +## Числовое значение |
| 24 | + |
| 25 | +```pawn |
| 26 | +// из сырого значения |
| 27 | +stock any:PCSingle_MyType(const JSON:valueJson, const any:def = 0, const orFailKey[] = "") { |
| 28 | + return PCSingle_Cell(valueJson, "MyType", def, orFailKey); |
| 29 | +} |
| 30 | +
|
| 31 | +// из поля объекта по ключу |
| 32 | +stock any:PCSingle_ObjMyType(const JSON:objectJson, const key[], const any:def = 0, const bool:dotNot = false, const bool:orFail = false) { |
| 33 | + return PCSingle_ObjCell(objectJson, key, "MyType", def, dotNot, orFail); |
| 34 | +} |
| 35 | +
|
| 36 | +// из результата |
| 37 | +stock any:PCGet_MyType(const Trie:p, const key[], const any:def = 0) { |
| 38 | + return PCGet_Cell(p, key, def); |
| 39 | +} |
| 40 | +``` |
| 41 | + |
| 42 | +## Строковое значение |
| 43 | + |
| 44 | +```pawn |
| 45 | +stock PCSingle_MyStr(const JSON:valueJson, out[], const outLen, const def[] = "", const orFailKey[] = "") { |
| 46 | + return PCSingle_Str(valueJson, "MyType", out, outLen, def, orFailKey); |
| 47 | +} |
| 48 | +
|
| 49 | +stock PCSingle_iMyStr(const JSON:valueJson, const def[] = "", const orFailKey[] = "") { |
| 50 | + new out[PARAM_VALUE_MAX_LEN]; |
| 51 | + PCSingle_Str(valueJson, "MyType", out, charsmax(out), def, orFailKey); |
| 52 | + return out; |
| 53 | +} |
| 54 | +
|
| 55 | +stock PCSingle_ObjMyStr(const JSON:objectJson, const key[], out[], const outLen, const def[] = "", const bool:dotNot = false, const bool:orFail = false) { |
| 56 | + return PCSingle_ObjStr(objectJson, key, "MyType", out, outLen, def, dotNot, orFail); |
| 57 | +} |
| 58 | +
|
| 59 | +stock PCGet_MyStr(const Trie:p, const key[], out[], const outLen, const def[] = "") { |
| 60 | + return PCGet_Str(p, key, out, outLen, def); |
| 61 | +} |
| 62 | +
|
| 63 | +stock PCGet_iMyStr(const Trie:p, const key[], const def[] = "") { |
| 64 | + return PCGet_iStr(p, key, def); |
| 65 | +} |
| 66 | +``` |
| 67 | + |
| 68 | +## Соглашение об именах |
| 69 | + |
| 70 | +- `..._Obj...` — значение из **объекта** по ключу; без `Obj` — из **сырого** значения; |
| 71 | +- `i`-префикс — возвращает временную строку; |
| 72 | +- внутри указывается **имя своего типа** строкой (`"MyType"`). |
| 73 | + |
| 74 | +## Замечания |
| 75 | + |
| 76 | +- Хелперы **не обязательны** для работы типа — это удобство и единый стиль. |
| 77 | +- `stock` компилируется только при использовании, поэтому держать их в `.inc` дёшево. |
| 78 | +- Свои хелперы стоит задокументировать в скилле типов плагина — см. скилл |
| 79 | + `param-types-authoring`. |
0 commit comments