Size: a a a

Rust — русскоговорящее сообществo

2020 September 24

Э

Эрик in Rust — русскоговорящее сообществo
folex
У меня есть общий конфиг, и я хочу его обеднять по пути перехода через слои абстракции. Обрезать лишние поля
Какое-то динамическое программирование.
источник

V

Vladimir in Rust — русскоговорящее сообществo
А, да, то что ты хочешь наверное лучше в паттерн билдер запихнуть
источник

Э

Эрик in Rust — русскоговорящее сообществo
folex
У меня есть общий конфиг, и я хочу его обеднять по пути перехода через слои абстракции. Обрезать лишние поля
А тебе его надо собирать или разбирать?
источник

f

folex in Rust — русскоговорящее сообществo
Эрик
А тебе его надо собирать или разбирать?
Разбирать. Сначала он большой, содержит в себе информацию для всей системы. Потом он проходит через дерево компонент, и более низкоуровневым компонентам нужно всё меньше информации
источник

f

folex in Rust — русскоговорящее сообществo
Ну я руками поля перекладываю, и норм
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
folex
Ну я руками поля перекладываю, и норм
а почему бы не составлять общий конфиг сразу из множества мелких конфигов для отдельных компонентов и явно требовать нужный конфиг в конструкторе компонента?
мы обычно так делаем
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
переложить какое то поле можно и забыть
источник

Э

Эрик in Rust — русскоговорящее сообществo
folex
Разбирать. Сначала он большой, содержит в себе информацию для всей системы. Потом он проходит через дерево компонент, и более низкоуровневым компонентам нужно всё меньше информации
Почему бы просто не выдавать ссылку на общий конфиг?
источник

f

folex in Rust — русскоговорящее сообществo
Andrei 🦉 Sergeev
а почему бы не составлять общий конфиг сразу из множества мелких конфигов для отдельных компонентов и явно требовать нужный конфиг в конструкторе компонента?
мы обычно так делаем
Множество мелких конфигов в итоге собирается из нескольких полей основного конфига, а-ля

struct ServerConfig {
   key_pair: Keypair,
   base_dir: PathBuf,
   envs: Vec<String>,
}

struct DHTConfig {
   peer_id: PeerId, // = key_pair.public().to_peer_id
   work_dir: PathBuf // = base_dir.join("something")
}

struct VMConfig {
   envs: Vec<String>,
   work_dir: PathBuf, // = base_dir.join("otherthing")
}


К тому же все эти три конфига живут в разных крейтах:
Server <- DhtAndVmUnion <- (DHT, VM)

Я конфиги держу в крейтах соответствующих компонент, и не хочется чтобы Serve зависел напрямую от DHT или VM, не его это дело :)
источник

f

folex in Rust — русскоговорящее сообществo
Эрик
Почему бы просто не выдавать ссылку на общий конфиг?
Две причины:
- Через некоторое время зависимость компонент от данных в конфиге становится сложной для понимания. Тут решение – ограничить кол-во данных
- Низкоуровневым модулям (DHT, VM) незачем знать про структуры высокоуровневых (Server)
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
folex
Множество мелких конфигов в итоге собирается из нескольких полей основного конфига, а-ля

struct ServerConfig {
   key_pair: Keypair,
   base_dir: PathBuf,
   envs: Vec<String>,
}

struct DHTConfig {
   peer_id: PeerId, // = key_pair.public().to_peer_id
   work_dir: PathBuf // = base_dir.join("something")
}

struct VMConfig {
   envs: Vec<String>,
   work_dir: PathBuf, // = base_dir.join("otherthing")
}


К тому же все эти три конфига живут в разных крейтах:
Server <- DhtAndVmUnion <- (DHT, VM)

Я конфиги держу в крейтах соответствующих компонент, и не хочется чтобы Serve зависел напрямую от DHT или VM, не его это дело :)
мне кажется вы себе создаёте сложности на ровном месте, а потом героически их преодолеваете)
источник

f

folex in Rust — русскоговорящее сообществo
Andrei 🦉 Sergeev
мне кажется вы себе создаёте сложности на ровном месте, а потом героически их преодолеваете)
А можно подробнее? :) Я буду только рад упроститься
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
ну то есть ваш подход - это явный оверкил для просто передачи конфигурационных параметров)
источник

DL

Danil Lugovskoy in Rust — русскоговорящее сообществo
А почему не into из большоггг конфига в маленькие ?
источник

f

folex in Rust — русскоговорящее сообществo
Danil Lugovskoy
А почему не into из большоггг конфига в маленькие ?
Ну в общем-то так и есть
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
folex
А можно подробнее? :) Я буду только рад упроститься
так он и не будет

Server (server config, который при инициализции дергает инициализацию union конфига) <- DhtAndVmUnion (requires union config (фактически обертка над dht и vm config, которая дёргает их конструкторы при инициализации) <- (DHT (requires dht config), VM (requires vm config))
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
все общие параметры явно требуются нижележащими конфигами в конструкторе

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

f

folex in Rust — русскоговорящее сообществo
Я чувствую недопонимание :)
источник

f

folex in Rust — русскоговорящее сообществo
Конфиги друг друга принимают в конструкторы, или наоборот предоставляют билдеры для низлежащих конфигов
источник

f

folex in Rust — русскоговорящее сообществo
Языком всё контролируется, тк поля-то нужно инициализировать, и аргументы передавать в конструктор, иначе не скомпилируется :)
источник