JSON圢åŒã®ãã£ãŒããããŠã³ããŒããã解æããããã©ãŒãããããã圢åŒã§ã³ã³ãœãŒã«äžã®ããŒãã®ãªã¹ãã衚瀺ããå°ããªããã°ã©ã ãäœæããæ¹æ³ã瀺ããŸãã
ãã¹ãŠãéåžžã«ç°¡æœãªã³ãŒãã«ãªããŸããã ã©ããã£ãŠïŒ ã«ããã®äžãèŠãŠãã ããã
RustãããŠã³ããŒã
RustãããŠã³ããŒãããéåžžã®æ¹æ³ã¯ã rustupã䜿çšããŠã³ã³ãã¥ãŒã¿ãŒã«ããŠã³ããŒãããããšã§ã ã rustup
é
åžãªããžããªã§ãã§ã«å©çšå¯èœãã©ããã確èªããŠãã ããã
rustup
ã¯rustup
管çããŸãã 䜿çšããŠããRustã®ããŒãžã§ã³ã®å€æŽãRLSãªã©ã®è¿œå ã®éçºããŒã«ã®ç®¡çãããŸããŸãªãã©ãããã©ãŒã çšã®éçºããŒã«ã®ããŠã³ããŒããå¯èœã§ãã
Rustãã€ã³ã¹ããŒã«ãããã次ã®ã³ãã³ããå
¥åããŸãã
rustup install stable
ãã®äŸã§ã¯ãå°ãªããšãRustããŒãžã§ã³1.20ã䜿çšããå¿
èŠããããŸããããã«ã¯ããã€ãã®äŸåé¢ä¿ãå¿
èŠã«ãªãããã§ãã
ç§ãã¡ãæã£ãŠãããã®ãèŠãŠã¿ãŸãããã
ãã®ã³ãã³ããã€ã³ã¹ããŒã«ãããŸããïŒ
- rustc-ã³ã³ãã€ã©
- è²šç© -ããã±ãŒãžãããŒãžã£ãŒããã³ãããžã§ã¯ããã«ããŒ
- ããã¥ã¡ã³ã
- ä»ã®ããŒã«ã
rustup doc
ãšrustup doc
ããŠããã©ãŠã¶ãŒã§rustup doc
ã衚瀺ããŸãã
ãããžã§ã¯ãã®ã»ããã¢ããïŒ cargo
cargo
ã¯Rustãããžã§ã¯ãã管çããŸãã å°ããªå®è¡å¯èœãã¡ã€ã«ããã«ããããããã©ã€ãã©ãªã§ã¯ãªãããã°ã©ã ããã«ãããããã«cargo
ã«æ瀺ããŸãã
cargo init --bin readrust-cli
ãã®ã³ãã³ãã¯readrust-cli
ãäœæããŸãã
ãã®ãã£ã¬ã¯ããªã«ãããã®ãèŠãŠã¿ãŸãããïŒ
. |
ãããžã§ã¯ãã¯åçŽãªæ§é ã«ãªã£ãŠããããšã«æ°ä»ãã§ãããããããžã§ã¯ãã®ã³ãŒãïŒ src/main.rs
ïŒãšïŒ Cargo.toml
ïŒã®ã¿ãå«ãŸããŠããŸãã Cargo.toml
å«ãŸãããã®ãèŠãŠã¿ãŸãããïŒ
[package] name = "readrust-cli" version = "0.1.0" authors = ["Florian Gilcher <florian.gilcher@asquera.de>"] [dependencies]
æ§æãã¡ã€ã«ã«ã¯çŸåšããããžã§ã¯ãã«é¢ãã説ææ
å ±ãå«ãŸããŠããŸãã çŸæç¹ã§ã¯ã dependencies
ã»ã¯ã·ã§ã³ã¯ç©ºã§ããã main.rs
ã¯ããã©ã«ãã§å°ããªãhello worldããå«ãŸããŠããããšã«æ³šæããŠãã ããã
å®è¡ïŒ
$ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs Running `target/debug/readrust-cli` Hello, world!
çŽ æŽãããã ãã¹ãŠãæ©èœããŸãã rustc
èªäœãrustc
ã³ã³ãã€ã©ãŒãèµ·åããããã°ã©ã ãã³ã³ãã€ã«ããŠããèµ·åããŸããã cargo
ã¯ãæã
ãè¡ã£ãã³ãŒãã®ãã¹ãŠã®å€æŽãæ€åºããããããåã³ã³ãã€ã«ããããšãã§ããŸãã
ããå§ããŸãããïŒ
äºåã«è¡åã®èšç»ãç«ãŠãŸãã ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠå¯Ÿè©±ã§ãããŠãŒãã£ãªãã£ãäœæããŸãã
äžæ¹ãç§ãã¡ã¯åé¡ã解決ããããŸãå€ãã®ä»äºãããããªãã
å¿
èŠãªãã®ïŒ
* * HTTP- * JSON * .
æ©èœã»ããã«ã€ããŠã¯ãéå§ããã®ã«ååãªæè»æ§ãå°ãè¿œå ããŸãã
- ããã°ã©ã ã¯
--count
ãåãå
¥ããã¹ããªãŒã å
ã®ããŒãã®æ°ã衚瀺ããããããã°ã©ã ã«æ瀺ããŸã - ããã°ã©ã ã¯
--number [NUMBER]
ãåãåããããã°ã©ã ãåºåããããŒãã®æ°ãèšå®ããŸãã
CLAP
- command line argument parser
è¡šãcommand line argument parser
ã
ç°¡åã§ãããã CLAPã«ã¯è©³çŽ°ãªããã¥ã¡ã³ãããããŸããã䜿çšããæ©èœã¯ãããããã§ãã
æåã«ãäŸåé¢ä¿ãšããŠclap
ããã±ãŒãžãè¿œå ããå¿
èŠããããŸãã
ãããè¡ãã«ã¯ã Cargo.toml
ååãšããŒãžã§ã³ãæå®ããå¿
èŠããããŸãã
[dependencies] clap = "2.29"
cargo build
ã cargo build
ãå®è¡cargo build
ãšãããã°ã©ã ã§clap
ãã³ã³ãã€ã«ãããŸãã CLAPã䜿çšããã«ã¯ãã©ã€ãã©ãªã䜿çšããŠããããšãRustã«äŒããå¿
èŠããããŸãïŒRustã®çšèªã§ã¯crate
ïŒã ãŸãã䜿çšããåãåå空éã«è¿œå ããå¿
èŠããããŸãã CLAPã«ã¯éåžžã«ãŠãŒã¶ãŒãã¬ã³ããªãŒãªAPIããããå¿
èŠãªã ãæ·±ãèšå®ããããšãã§ããŸãã
extern crate clap; use clap::App; fn main() { let app = App::new("readrust") .version("0.1") .author("Florian G. <florian.gilcher@asquera.de>") .about("Reads readrust.net") .args_from_usage("-n, --number=[NUMBER] 'Only print the NUMBER most recent posts' -c, --count 'Show the count of posts'"); let matches = app.get_matches(); }
次ã®ã¹ãããã¯ãæ瀺ã¡ãã»ãŒãžãåãåãããã«--help
ãªãã·ã§ã³ãæå®ããŠããã°ã©ã ãã³ã³ãã€ã«ããã³å®è¡ããããšã§ãã
readrust 0.1 Florian G. <florian.gilcher@asquera.de> Reads readrust.net USAGE: readrust [FLAGS] [OPTIONS] FLAGS: -c,
ãããïŒ ããã€ãã®ç°¡åãªè¡ããããããã°ã©ã ã䜿çšããããã®æ¬æ Œçãªæ瀺ãæ¢ã«ãããŸãã
ããã°ã©ã ããã¹ãããã«ã¯ãå¿
èŠãªè³æãå¿
èŠã§ãã
ããã次ã®ã·ã°ããã£ãæã€é¢æ°ã§ã©ããããŸãã
fn get_feed() -> String {
è¯ãHTTPã¯ã©ã€ã¢ã³ãã®1ã€ã¯reqwest
ã§ãã åãèè
ããã®hyper
ããããŸãã Hyperã¯ãããäœã¬ãã«ãã®ã©ã€ãã©ãªã§ããã reqwest
䜿çšreqwest
ãšããæ©ããããããªã©ã®ã¿ã¹ã¯ã解決ã§ãreqwest
ã
[dependencies] reqwest = "0.8"
ãã®é¢æ°ã¯éåžžã«ç°¡åã«å®è£
ãããŸãã
extern crate reqwest; pub static URL: &str = "http://readrust.net/rust2018/feed.json"; fn get_feed() -> String { let client = reqwest::Client::new(); let mut request = client.get(URL); let mut resp = request.send().unwrap(); assert!(resp.status().is_success()); resp.text().unwrap() }
ããã¯ãä»ã®ããã°ã©ãã³ã°èšèªã§è¡ãæ¹æ³ãšéåžžã«äŒŒãŠããŸãããªã¯ãšã¹ããè¡ãããšãã§ããã¯ã©ã€ã¢ã³ããäœæããŸãã
send()
åŒã³åºãsend()
ã«ããããªã¯ãšã¹ããäœæããŠã¬ã¹ãã³ã¹ãååŸããŸãã
å¿çã§text()
ãåŒã³åºãããšã«ãããæååãšããŠååŸããŸãã
mutãšããåèªã«æ³šæããŠãã ããã Rustã§ã¯ãå¯å€å€æ°ã¯ãã®æ¹æ³ã§å®£èšãããŸãã èŠæ±ãéä¿¡ããŠå¿çãåä¿¡ããããšã«ãããå
éšç¶æ
ãå€æŽããŸã
ãªããžã§ã¯ãããªã¯ãšã¹ããããããå¯å€ã§ããå¿
èŠããããŸãã
æåŸã«ã ã¢ã³ã©ããããŠã¢ãµãŒãããŸãã
èŠæ±ã®éä¿¡ãŸãã¯å¿çã®èªã¿åãã¯ã倱æããå¯èœæ§ã®ããæäœã§ããããšãã°ãæ¥ç¶ãåæãããŸãã
ãããã£ãŠãéä¿¡ïŒèŠæ±ãéä¿¡ïŒããã³text
ïŒå¿çããèªã¿åããïŒã¯ã Result
ãªããžã§ã¯ããè¿ããŸãã
Rustã¯ãè¿ããããªããžã§ã¯ãã®ã³ã³ãã³ããåæãã
å¿
èŠãªæªçœ®ãè¬ããŸãã unwrap
ã¯ãããã¯ã«ã€ãªãããŸã-ããã°ã©ã ã¯çµäºããŸããããã®åã«äœ¿çšæžã¿ã®ã¡ã¢ãªããæ¶å»ãããŸãã
ãšã©ãŒããªãã£ãå Žåãå¿
èŠãªå€ãååŸããŸãã ãµãŒããŒãå¿çãããšããæå³ã§èŠæ±ã¯æåããå¯èœæ§ããããŸãããHTTPæ»ãã³ãŒãã¯200 SUCCESS
ïŒå
éšãµãŒããŒãšã©ãŒïŒïŒã§ã¯ãããŸããã
assert
ã¯ã倱æãããªã¯ãšã¹ãããã®ã¬ã¹ãã³ã¹ã®å
容ãèªã¿åããªãããã«ããŸãã
ãã®å Žæã®å€ãã®ã¹ã¯ãªããèšèªã§ã¯ãæªåŠçã®äŸå€ãçºçããåæ§ã®å¹æãåŸãããŸãã
Rustã«ã¯äŸå€ã¯ãããŸãã -代ããã«ADTã䜿çšããŸãïŒHaskellã®Maybe
ãªã©ïŒã
ãã¬ãŒãã³ã°äžã«unwrap
ã«äœ¿çšããããšãæããªãã§ãã ããã
åŸã§ãä»ã®æ段ã®äœ¿çšæ¹æ³ãåŠç¿ããŸãã
JSON解æïŒ serde
æ¥ç¶
次ã«ãJSONããŒãã解æããå¿
èŠããããŸãã
ãããè¡ãããã«ãRustã«ã¯ïŒse / desïŒã·ãªã¢ã«åçšã®serde
ã©ã€ãã©ãªããããŸãã
serde
ã¯JSONã ãã§ãªããä»ã®åœ¢åŒããµããŒãããŠããŸãã
serde
ãŸãã
ã·ãªã¢ã©ã€ãºå¯èœãªåã®å²ãåœãŠãããããã derive
ãã
ãã®ããã次ã®3ã€ã®äŸåé¢ä¿ãè¿œå ããå¿
èŠããããŸãã
serde
ã serde_derive
ã serde_json
ã
[dependencies] serde = "1.0" serde_derive = "1.0" serde_json = "1.0"
serde_json
ã¯ã2ã€ã®æ¹æ³ã§JSONãåŠçããæ©èœãæäŸããŸãïŒæååãJSONããªãŒã«è§£æãããã serde_json
äºæ³ãããæ
å ±ã®æ§é ãäŒããã
2çªç®ã®æ¹æ³ã¯ãã¯ããã«é«éã§äŸ¿å©ã§ãã
feedã®å®çŸ©ãèŠããšãäž»ã«3ã€ã®ã¿ã€ããããããšãããããŸãã
ãªãã³ãšèŠçŽ ã«ã¯äœæè
ãããŸãã
ã³ãŒããå€æŽããŸãã
extern crate serde; #[macro_use] extern crate serde_derive; extern crate serde_json; #[derive(Debug, Deserialize, Serialize)] struct Author { name: String, url: String, }
ãã®äŸãããããããããããããã«ãURLãéåžžã®æååãšããŠæ瀺ããŸããããå°æ¥ãããå€æŽã§ããŸãã ãŸãã2ã€ã®ãã£ãŒã«ããæã€åçŽãªããŒã¿æ§é ãå®çŸ©ããŸãã ãããã®ãã£ãŒã«ãã®ååã¯ãJSONã®å¯Ÿå¿ãããã£ãŒã«ããšäžèŽããŸãã æãèå³æ·±ãã®ã¯ã derive
ã®è¡ã«ããderive
ã
ãã®æ§é ã«åºã¥ããŠè¿œå ã®ã³ãŒããçæããããã³ã³ãã€ã©ãŒã«æ瀺ããŸãã
- ãããã°ã¯ãããã°æååãã¥ãŒãçæããŸããããã¯å€ãã®å Žå䟿å©ã§ã
- çæã³ãŒããã·ãªã¢ã«å/éã·ãªã¢ã«åããŠãããŒã¿æ§é ãã·ãªã¢ã«åããŸãã ããã¯ããŸã 䜿çšããäºå®ã®JSON圢åŒãšã¯é¢ä¿ãããŸããã
ããŒãå
ã®èŠçŽ ãè¡šãããã®æ§é ãäœæããŸãããã
#[derive(Debug, Deserialize, Serialize)] struct FeedItem { id: String, title: String, content_text: String, url: String, date_published: String, author: Author, }
ããã¯ããã§ã«èšå®ããæ§é ã«äŒŒãŠããŸãã Author
ã¿ã€ããã£ãŒã«ããå«ããããã«æ§æã䜿çšããããšãããããŸãã
ãã®ã¿ã€ããå¿
èŠãªçç±ãããéåŒã«ç€ºããããã¿ã€ããFeedItem
ãšåä»ããŸããã
ããŒãã®çš®é¡ãã©ã®ããã«ãªããèŠãŠã¿ãŸãããã
#[derive(Debug, Deserialize, Serialize)] struct Feed { version: String, title: String, home_page_url: String, feed_url: String, description: String, author: Author, items: Vec<FeedItem>, }
ãªãã³èŠçŽ ãå«ããã¯ã¿ãŒã§ããitems
ãã£ãŒã«ããå«ããããšãé€ããŠãããã«ã¯æ°ãããã®ã¯ãããŸããã
Vec
ã¯ãäœãã®ãªã¹ããè¡šãããã®Rustã®æšæºåã§ãã åãã¿ã€ãã®ãªããžã§ã¯ãã®ä»»æã®ã»ãããå«ããããšãã§ããŸãã
ä»ã®èšèªã®ãžã§ããªãã¯ã«æ
£ããŠãã人ã«ãšã£ãŠã¯ããã®æå®ã¯ãã§ã«ããç¥ãããŠããŸãã
get_feed
ãString
代ããã«Feed
ãè¿ãããã«ããŸãïŒ
fn get_feed() -> Feed { let client = reqwest::Client::new(); let mut request = client.get(URL); let mut resp = request.send().unwrap(); assert!(resp.status().is_success()); let json = resp.text().unwrap(); serde_json::from_str(&json).unwrap() }
è¿œå ããããšã¯2ã€ã ãã§ããè¿ãããããã¹ããjson
å€æ°ã«å²ãåœãŠãé¢æ°ãåŒã³åºããŠãã®å€æ°ã解æããŸãã
解æã倱æããå¯èœæ§ããããããããã°ã©ã ã¯èª€ã£ãå€ãå«ãçµæãè¿ãå ŽåããããŸãã é¢æ°ãæåããå Žåãå€ãæœåºããã«ã¯unwrap
ãåŒã³åºãå¿
èŠããããŸãã
get_feedé¢æ°ã§æ»ãå€ã®åãå€æŽããæ¹æ³ãããRustã¯JSONããã¹ããFeed
åã®å€æ°ã«å€æããå¿
èŠãããããšãçºèŠããŸããã
json
æ£ããJSONãå«ãŸããŠããªãå Žåãããã°ã©ã ã¯ãšã©ãŒã§çµäºããŸãããã®ãããreadrust.netãããŒãã®ãšã³ã³ãŒã圢åŒãå€æŽãããšãããã«ãããããããŸãã
ã«ãŠã³ã
å®æéè¿ã§ãããçµæããŠãŒã¶ãŒã«è¡šç€ºããããã®ã³ãŒãããŸã äœæããŠããŸããã
æ£è§£-ããŒãå
ã®èŠçŽ ã®æ°ããŠãŒã¶ãŒã«è¡šç€ºããããã°ã©ã ãæããŸãã
fn print_count(feed: &Feed) { println!("Number of posts: {}", feed.items.len()); }
&
èŠãŠãã ããïŒRustã¯ãåŒæ°ãæž¡ã2ã€ã®æ¹æ³ãæäŸããã·ã¹ãã ããã°ã©ãã³ã°èšèªã§ãã
- æææš©ã®è²æž¡
ïŒ pass ownership
ã ææ ïŒ - ãªã³ã¯è»¢é-åçšïŒ
borrow
ã borrowed ïŒã
æææš© -ããã¯ãåŒã³åºãå
ã®ã³ãŒããéä¿¡ããããªããžã§ã¯ãã«ã¢ã¯ã»ã¹ã§ããªããªãããšãæå³ããŸãïŒãªããžã§ã¯ãã®æææš©ã転éããŸãïŒã ããªããææããæå³ã§ãããªãã¯ãã¹ãŠãããããšãã§ããŸãïŒããããç Žå£ããããããç¡èŠãããããã䜿çšããŸãã
åçš -ããã¯ããªããžã§ã¯ãããèŠããããšããã§ããªãããšãæå³ããŸãããã®åŸããªããžã§ã¯ãããã®ææè
ã«æ»ãå¿
èŠããããŸãã ææè
ã¯ãããããã£ãå€æŽããèš±å¯ãäžããå Žåãšäžããªãå ŽåããããŸãã ãªããžã§ã¯ããå€æŽããå¿
èŠããªããªã£ããããäžå€ã®ãªã³ã¯ãããªããžã§ã¯ããåçšããŸãã
main
å€èŠ³ã¯æ¬¡ã®ãšããã§ãã
let matches = app.get_matches(); let feed = get_feed(); if matches.is_present("count") { print_count(&feed); }
gen_matches
ã¯ãããã°ã©ã ã«æž¡ãããåŒæ°ã決å®ããŸããã
is_present
åŒã³åºãã«ããããŠãŒã¶ãŒ--count
åŒæ°ã--count
ãã©ãã--count
ãŸãã ããã§&
ã䜿çšããŠãåç
§ã«ãã£ãŠãªããžã§ã¯ããæž¡ãããããšãã³ã³ãã€ã©ã«äŒããå¿
èŠãããããšã«æ³šæããŠãã ããã
å®è¡ïŒ
[ skade readrust-cli ] cargo run -- --count Compiling readrust v0.1.0 (file:///Users/skade/Code/rust/readrust-cli) Finished dev [unoptimized + debuginfo] target(s) in 2.46 secs Running `target/debug/readrust --count` Number of posts: 82
ããã§ãç»é¢ã«çµæã衚瀺ããããã«ããã°ã©ã ã«æããå¿
èŠããããŸãã prettytable
ã©ã€ãã©ãªã䜿çšããŠããŒãã«ãå°å·ããããšã«ããŸãã
[dependencies] prettytable-rs = "0.6"
ã©ã€ãã©ãªã䜿çšãã1ã€ã®äŸãèŠãŠã¿ãŸãããã
#[macro_use] extern crate prettytable; fn print_feed_table<'feed, I: Iterator<Item = &'feed FeedItem>>(items: I) { let mut table = prettytable::Table::new(); table.add_row(row!["Title", "Author", "Link"]); for item in items { let title = if item.title.len() >= 50 { &item.title[0..49] } else { &item.title }; table.add_row(row![title, item.author.name, item.url]); } table.printstd(); }
次ã®ç¹ã«æ³šæãã䟡å€ããããŸãã
- ã«ãŒãã䜿çšããŠèŠçŽ ã調ã¹ã
ããããåŒãåºã - äžéšã®èè
ã¯ãèŠåºããä»ããŠã¡ã¢ãåãããšã奜ã¿ãŸããã
50æåãè¶
ããå Žåã¯ãããããçãããŸã
Rust ã§valueãè¿ãåŒã§ããif
èŠãŠã¿ãŸãããã
ããã¯ã if
å€æ°ã®è©äŸ¡çµæã«title
å€æ°ãå²ãåœãŠãããšãã§ããããšãæå³ããŸãã å®è¡ã®å¯èœæ§ã®ãã2ã€ã®åå²ãèŠããšãæå&
ã衚瀺ãããŸã-ããã¯ããã€ã¯ã¢ã¹ã©ã€ã¹ãïŒ slice ïŒãšåŒã°ããŸã ã ã¿ã€ãã«ãé·ãããå Žåã¯ãæåã®50æåãžã®ãªã³ã¯ã䜿çšãããããã³ããŒããå¿
èŠã¯ãããŸããã åçšãšåçšã®é¡äŒŒæ§ã¯å¶ç¶ã§ã¯ãããŸãããã¹ã©ã€ã¹ãåçšããŸãã
ããã«ããã眲åã¯æ¬¡ã®ããã«ãªããŸãã
fn print_feed_table<'feed, I: Iterator<Item = &'feed FeedItem>>(items: I)
é¢æ°ã¯ãžã§ããªãã¯ã§åäœããããã print_feed_table
å®è£
ã«è¿œå ããããšã«ããŸããã ãã®é¢æ°ã¯ã Iterator
ãå®è£
ãããªããžã§ã¯ããåãåããåçšããèŠçŽ ãæäŸããŸãã
Iterator
ãæäŸãããšã³ãã£ãã£ã¯ã Item
ãšåŒã°ããã¿ã€ããã©ã¡ãŒã¿ãŒããã®å Žåã¯FeedItem
ã§ãã æåŸã«ã 'feed
ã
Rustã¯ããã¹ãŠã®ãªã³ã¯ãäœããæããŠããããšããã§ãã¯ããŸãããªã³ã¯ãæããŠãããã®ã¯ååšããŠããªããã°ãªããŸããã
ãã®ã»ãã³ãã£ã¯ã¹ã¯ãé¢æ°ã·ã°ããã£ã§è¡šçŸãããŸãã èŠçŽ ãžã®ãªã³ã¯ãè¿ãããã«ããããã®èŠçŽ ãã¡ã¢ãªå
ã«ããããšã確èªããå¿
èŠããããŸãã 倧ãŸãã«èšã£ãŠã <'feed, I: Iterator<Item = &'feed FeedItem>>
ã¯ã 'feed
éã«ååšããé¢æ°ã®å€åŽã«ç¹å®ã®ãšã³ãã£ãã£ãããããšãæå³ã'feed
ãã®ãšã³ãã£ãã£ã¯ãåãããã¢ã€ãã ããæäŸããŸãã ã€ãã¬ãŒã¿IãååŸããŸãããã®ã€ãã¬ãŒã¿ã¯ãèŠçŽ ããå®è¡ãããŠãåããèŠçŽ ãæäŸããŸãã 寿åœã¯ãããã®æ¯çãè¡šããŸãã
次ã®ããã«ãªããŸãã
if matches.is_present("count") { print_count(&feed); } else { let iter = feed.items.iter(); if let Some(string) = matches.value_of("number") { let number = string.parse().unwrap(); print_feed_table(iter.take(number)) } else { print_feed_table(iter) } }
ããã«ããã®ç¹å®ã®å®è£
ãéžæããçç±ã瀺ããŸãã --number
ãªãã·ã§ã³ã®ãµããŒããæå¹ã«ããããã«ãIteratorã䜿çšããããšã«ããŸããã
ãŠãŒã¶ãŒãæ°å€ãæå®ããå Žåããã®æ°å€ãæååã«å€æããŸãïŒãã¡ãããã©ã³ãã ãªæååãæž¡ããããšå€±æããå ŽåããããŸãïŒã
æ®ãã®èŠçŽ ã®ã»ãããTake
ã€ãã¬ãŒã¿ãŒã«å€æããåŸã Take
ã¯ãå
ã®ã€ãã¬ãŒã¿ããããã€ãã®èŠçŽ ãè¿ããå®è¡ãå®äºããŸãã
ãã¹ãŠæºåå®äºã§ãïŒ ããã§ãœãŒã¹ã³ãŒããèŠã€ããããšãã§ããŸãã
次ã«äœãããïŒ
æ¡åŒµå¯èœãªããã°ã©ã ãäœæããŸããã
ããšãã°ã次ãè©Šãããšãã§ããŸãã
- ãã£ãŒãããŒãçµ±èšãèšç®ãã
- èŠåºããæ£èŠè¡šçŸã«äžèŽããããŒãã®ã¿ãéžæãã
- ãã詳现ãªã¡ãã»ãŒãžã§ãšã©ãŒåŠçãæ¹å
- æååïŒ
String
ïŒã§ã¯ãªãã察å¿ããåã®å€æ°ã§æ¥ä»ãè¡šããŸã - ãªã³ã¯ããã©ããã¡ã¢ã®å
容ãååŸããŸãã
ãŸãšã
ãšã©ãŒããªããããŒã¿ããã§ãã¯ããããã°ã©ã ãååŸããŸããã
åŠçåŸã®ããã°ã©ã ã
JSON
ããŒã¿ã¯å®å
šã«è§£æããããšã©ãŒãæ€åºããJSON
ã
ãã®ããã°ã©ã ã¯ãäºæããªãç¶æ³ã«ããŸã察åŠããŸãã ããšãã°ãé
åãžã®ã€ã³ããã¯ã¹ä»ãã¢ã¯ã»ã¹ã®ä»£ããã«å埩ã䜿çšãããšãé
åå€ã®èŠçŽ ãžã®ã¢ã¯ã»ã¹ããä¿è·ãããŸã=> segfaultã¯ãããŸããã
ãã®ããã°ã©ã ã¯ãååã«ææžåãããã©ã€ãã©ãªã䜿çšããŠèšè¿°ãããŠãããããã³ãŒãã®èšè¿°ã«ããã«é²ãããšãã§ããŸãã Rustã®å³æžé€šã®ç¶æ³ã¯ãããšãã°2幎åãããã¯ããã«è¯ããªããŸããããã§ã«å€ãã®æçããå³æžé€šããããŸãã
- ããã°ã©ã ã¯ç§»æ€æ§ããããŸãïŒ ã¯ãã¹ãã©ãããã©ãŒã ïŒ=>å®è¡å¯èœãã¡ã€ã«ãã³ããŒããã ãã§ããã°ã©ã ãå
±æã§ããŸãã
å®å
šãªãœãŒã¹ã³ãŒãã次ã«ç€ºããŸãã
extern crate clap; #[macro_use] extern crate prettytable; extern crate reqwest; extern crate serde; #[macro_use] extern crate serde_derive; extern crate serde_json; use clap::App; pub static URL: &str = "http://readrust.net/rust2018/feed.json"; #[derive(Debug, Deserialize, Serialize)] struct Author { name: String, url: String, } #[derive(Debug, Deserialize, Serialize)] struct FeedItem { id: String, title: String, content_text: String, url: String, date_published: String, author: Author, } #[derive(Debug, Deserialize, Serialize)] struct Feed { version: String, title: String, home_page_url: String, feed_url: String, description: String, author: Author, items: Vec<FeedItem>, } fn print_count(feed: &Feed) { println!("Number of posts: {}", feed.items.len()); } fn print_feed_table<'feed, I: Iterator<Item=&'feed FeedItem>>(items: I) { let mut table = prettytable::Table::new(); table.add_row(row!["Title", "Author", "Link"]); for item in items { let title = if item.title.len() >= 50 { &item.title[0..49] } else { &item.title }; table.add_row(row![title, item.author.name, item.url]); } table.printstd(); } fn get_feed() -> Feed { let client = reqwest::Client::new(); let mut request = client.get(URL); let mut resp = request.send().unwrap(); assert!(resp.status().is_success()); let json = resp.text().unwrap(); serde_json::from_str(&json).unwrap() } fn main() { let app = App::new("readrust") .version("0.1") .author("Florian G. <florian.gilcher@asquera.de>") .about("Reads readrust.net") .args_from_usage( "-n, --number=[NUMBER] 'Only print the NUMBER most recent posts' -c, --count 'Show the count of posts'", ); let matches = app.get_matches(); let feed = get_feed(); if matches.is_present("count") { print_count(&feed); } else { let iter = feed.items.iter(); if let Some(string) = matches.value_of("number") { let number = string.parse().unwrap(); print_feed_table(iter.take(number)) } else { print_feed_table(iter) } } }
ãã®èšäºã®ç¿»èš³ãæ ¡æ£ãç·šéã«è²¢ç®ããŠãããRustycrateã³ãã¥ããã£ã®çããã«æè¬ããŸãã ã€ãŸããborn2loseãvitvakatuã
æŽæ° ïŒå®å
šãªãœãŒã¹ã³ãŒããè¿œå ããŸããã