Создаём REST-сервис на Rust. Часть 2: читаем INI; multirust

от автора

Всем привет.

В первой части мы сделали простейший прототип, работающий с PostgreSQL.

При этом мы прописали все параметры соединения с базой прямо в коде. Давайте теперь вынесем их в конфигурационный файл.

В качестве формата конфигурации я выбрал INI — достаточно простой и известный формат.


Первым делом нам нужно найти библиотеку для работы с INI-файлами.

Тут нам поможет crates.io — централизованное хранилище контейнеров Rust. Идём туда, вбиваем в поиске «ini», и первая же ссылка ведёт на нужную нам библиотеку: rust-ini.

Использовать её, судя по примеру на главной, достаточно просто. Попробуем:

Код

extern crate ini; ... use ini::Ini;  fn params() -> (ConnectParams, SslMode) {     let conf = Ini::load_from_file(".phonebookrc").unwrap();     let general = conf.general_section();      let host = general.get("host").unwrap();     let port = general.get("port").unwrap();     let sslmode = general.get("sslmode").unwrap();     let dbname = general.get("dbname").unwrap();     let user = general.get("user").unwrap();     let pass = general.get("pass").unwrap();      let s = match sslmode.as_ref() {         "disable" => SslMode::None,         "enable" => unimplemented!(),         _ => panic!("Wrong sslmode"),     };      (ConnectParams {         target: ConnectTarget::Tcp(host.to_owned()),         port: Some(FromStr::from_str(port).ok().unwrap()),         user: Some(UserInfo {             user: user.to_owned(),             password: Some(pass.to_owned()),         }),         database: Some(dbname.to_owned()),         options: vec![],     }, s) }  fn main() {     let (params, sslmode) = params(); ... 

Однако, если сейчас мы попробуем собрать программу, нас постигнет неудача:

 $ cargo build    Compiling bufstream v0.1.1    Compiling debug-builders v0.1.0    Compiling gcc v0.3.6    Compiling rustc-serialize v0.3.14    Compiling phf_shared v0.7.3    Compiling libc v0.1.8    Compiling byteorder v0.3.10    Compiling phf v0.7.3    Compiling log v0.3.1    Compiling rand v0.3.8    Compiling rust-ini v0.6.0 (https://github.com/zonyitoo/rust-ini/#0b3a3894)    Compiling time v0.1.26 /home/mkpankov/.multirust/toolchains/stable/cargo/git/checkouts/rust-ini-4a9e7dbb298b5764/master/src/lib.rs:48:1: 48:16 error: #[feature] may not be used on the stable release channel /home/mkpankov/.multirust/toolchains/stable/cargo/git/checkouts/rust-ini-4a9e7dbb298b5764/master/src/lib.rs:48 #![feature(io)]                                                                                                                ^~~~~~~~~~~~~~~ error: aborting due to previous error    Compiling rust-crypto v0.2.31 Build failed, waiting for other jobs to finish... Could not compile `rust-ini`. 

Компилятор говорит о том, что возможность «io» не может быть использована в стабильном компиляторе. Хм.

Как можно видеть, «feature(io)» используем не мы, а сам rust-ini. И в каком же компиляторе она тогда может быть использована? Ответ, конечно же — в нестабильном Rust.

Стоит заметить, что в подобные моменты проще сходить в чат (хотя бы в наш русскоязычный) и спросить, что происходит и что делать. Документация по отключаемым возможностям есть, но она не совсем поспевает за реальным положением дел.

Ладно, и что теперь? Нужно переустанавливать компилятор только ради этого? К сожалению, да, но, к счастью, делать это нужно сделать только один раз.

Познакомьтесь с multirust.

Этот инструмент управляет версиями компилятора и позволяет мгновенно переключаться между ними, а также упрощает обновление.

Устанавливаем его (предварительно стоит удалить уже установленный Rust):

 $ curl -sf https://raw.githubusercontent.com/brson/multirust/master/blastoff.sh | sh 

Теперь мы можем установить сами компиляторы и сказать, что нашему проекту нужен ночной компилятор:

 $ multirust update ... $ cd rust-phonebook $ multirust override nightly multirust: using existing install for 'nightly' multirust: override toolchain for '/home/mkpankov/rust-phonebook.finished' set to 'nightly' 

Теперь попробуем пересобрать наш проект:

 $ cargo build ...    Compiling rust-phonebook v0.1.0 (file:///home/mkpankov/rust-phonebook.finished) src/main.rs:10:5: 10:12 warning: struct field is never used: `id`, #[warn(dead_code)] on by default src/main.rs:10     id: i32,                    ^~~~~~~ $ 

Всё собралось!

multirust делает работу гораздо удобнее. Новые проекты всё же лучше начинать на стабильном компиляторе, и переключаться только по необходимости — ситуация с нестабильными возможностями такова, что они нужны далеко не всем проектам. А обновление всех сборок делается с ним всего одной командой «multirust update».

Ложка дёгтя здесь в том, что multirust на данный момент работает только на Windows. Но установить несколько компиляторов на Windows вам ничего не помешает — они по-умолчанию ставятся в разные места.

На сегодня всё. Теперь вы знаете, где искать библиотеки, и что делать, если им требуются нестабильные возможности.

ссылка на оригинал статьи http://habrahabr.ru/post/267661/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *