Компанія Apple відкрила реалізацію мови програмування Pkl, призначеного для визначення конфігурації та просуває модель «конфігурація як код». Пов'язаний з Pkl інструментарій написаний на Kotlin та опублікований під ліцензією Apache. p align="justify"> Плагіни для роботи з кодом мовою Pkl підготовлені для середовищ розробки IntelliJ, Visual Studio Code і Neovim. Найближчим часом очікується публікація обробника LSP (Language Server Protocol).
Pkl поєднує властивості простої для сприйняття декларативної мови з розширеними можливостями, властивими мовам загального призначення. У мові підтримуються інструкції типів, класи, функції, обчислювальні висловлювання, умови та цикли. Pkl може застосовуватися як для генерації статичних конфігурацій у різних форматах, таких як JSON, YAML та XML, так для формування модулів для обробки заданих форматів конфігурації у додатках різними мовами програмування.
Прив'язки для інтеграції Pkl додатків підготовлені для Java, Kotlin, Go і Swift. Окремо запропоновано модуль для інтеграції з фреймворком Spring. Прив'язки дозволяють на основі конфігурації мовою Pkl сформувати готові пакети та модулі з класами для роботи з описаною конфігурацією у додатку. Пакети з описом конфігурації можуть публікуватися в репозиторіях та імпортуватися як залежність, що допускає спільне використання коду Pkl між різними проектами.
Мова надає гнучкі кошти визначення умов і перевірок коректності значень, дозволяють виявляти помилки у підсумковій конфігурації етапі до її застосування у додатку. Наприклад, можна визначити допустимий діапазон значень ("port: Int(this > 1000)" або "age: Int(isBetween(0, 130))"), обов'язковість або необов'язковість заповнення та формат ("zipCode: String(matches(Regex("\d{5}"))))). У разі визначення значення, що не відповідає умові, валідатор виведе помилку (наприклад, при спробі призначити значення 1001 параметру, визначеному як «Int(this > 1000)»).
Наприклад, на мові Pkl можна написати модуль Application.pkl з шаблоном конфігурації підключення до СУБД: module Application hostname: String port: UInt16 environment: Environment database: Database class Database { "dev"|"qa"|"prod"
Далі можна створити безпосередньо файл конфігурації, що використовує даний модуль для перевірки коректності значень: amends Application.pkl hostname = localhost port = 3599 environment = dev database { host = localhost port = 5786 username = admin "myapp" }
А також написати генератор для автоматизації зміни номера порту для чотирьох різних СУБД: import "Application.pkl" hidden db: Application.Database = new { host = "localhost" username = "admin" password = read(" 2, 3)) { (db) { port = 6000 + offset } } }
При бажанні можна експортувати конфігурацію в іншому форматі, наприклад, YAML: sidecars: — username: admin password: hunter2 host: localhost port: 6000 dbName: myapp — username: admin password: hunter2 host: localhost port: 6001 db 6002 dbName: myapp — username: admin password: hunter2 host: port localhost: 6003 dbName: myapp
Схема конфігурації мовою Pkl також може бути перетворена на класи або структури для вбудовування в код програми. Наприклад, можна згенерувати прив'язку для Kotlin: import kotlin.Int import kotlin.Long import kotlin.String data class Application( val hostname: String, val port: Int, val environment: Int, val dbName: String ) enum class Environment( val value: String ) { DEV(«dev»), QA(«qa»), PROD(«prod»); override fun toString() = value } }
Джерело: opennet.ru
