Skip to content

Commit cda3c50

Browse files
committed
feat: search site post
1 parent 72f3cef commit cda3c50

File tree

7 files changed

+138
-0
lines changed

7 files changed

+138
-0
lines changed

src/args/cmd/post.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ pub struct SearchCmd {
110110
#[arg(long = "self")]
111111
#[arg(value_name = "KEYWORD")]
112112
pub self_keyword: Option<String>,
113+
114+
#[arg(verbatim_doc_comment)]
115+
/// Search site post
116+
/// Example: cnb post search --site 'Keyword'
117+
#[arg(long)]
118+
#[arg(long = "site")]
119+
#[arg(value_name = "KEYWORD")]
120+
pub site_keyword: Option<String>,
113121
}
114122

115123
#[derive(Debug, Subcommand)]

src/args/parser/post.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,38 @@ pub fn search_self_post(args: &Args) -> Option<(&String, usize, usize)> {
112112
cmd:
113113
Some(cmd::post::Cmd::Search(cmd::post::SearchCmd {
114114
self_keyword: Some(keyword),
115+
site_keyword: None,
116+
})),
117+
})),
118+
id: None,
119+
rev: _,
120+
skip,
121+
take,
122+
global_opt: _,
123+
} => {
124+
let skip = get_skip(skip);
125+
let take = get_take(take);
126+
(keyword, skip, take)
127+
}
128+
_ => return None,
129+
}
130+
.wrap_some()
131+
}
132+
133+
pub fn search_site_post(args: &Args) -> Option<(&String, usize, usize)> {
134+
match args {
135+
Args {
136+
cmd:
137+
Some(Cmd::Post(cmd::post::Opt {
138+
show: false,
139+
show_meta: false,
140+
show_comment: false,
141+
list: false,
142+
delete: false,
143+
cmd:
144+
Some(cmd::post::Cmd::Search(cmd::post::SearchCmd {
145+
self_keyword: None,
146+
site_keyword: Some(keyword),
115147
})),
116148
})),
117149
id: None,

src/display/colorful/post.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::api::post::get_comment_list::PostCommentEntry;
22
use crate::api::post::get_one::PostEntry;
3+
use crate::api::post::search_site::SearchResultEntry;
34
use crate::args::TimeStyle;
45
use crate::display::colorful::fmt_err;
56
use crate::infra::result::WrapResult;
@@ -136,3 +137,34 @@ pub fn search_self_post(
136137
},
137138
)
138139
}
140+
141+
pub fn search_site_post(
142+
time_style: &TimeStyle,
143+
entry_iter: Result<impl ExactSizeIterator<Item = SearchResultEntry>>,
144+
) -> Result<String> {
145+
let entry_iter = match entry_iter {
146+
Ok(o) => o,
147+
Err(e) => return fmt_err(&e).wrap_ok(),
148+
};
149+
150+
entry_iter
151+
.map(|entry| try {
152+
let mut buf = String::new();
153+
{
154+
let buf = &mut buf;
155+
let create_time = display_cnb_time(&entry.create_time, time_style);
156+
writeln!(buf, "{} {}", create_time.dimmed(), entry.url.dimmed())?;
157+
writeln!(buf, " {}", entry.title)?;
158+
let view_vote_comment_count = format!(
159+
"View {} Vote {} Comment {}",
160+
entry.view_count, entry.vote_count, entry.comment_count
161+
);
162+
writeln!(buf, " {}", view_vote_comment_count.dimmed())?;
163+
}
164+
buf
165+
})
166+
.try_fold(String::new(), |mut acc, buf: Result<String>| try {
167+
writeln!(&mut acc, "{}", buf?)?;
168+
acc
169+
})
170+
}

src/display/json/post.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::api::post::get_comment_list::PostCommentEntry;
22
use crate::api::post::get_one::PostEntry;
3+
use crate::api::post::search_site::SearchResultEntry;
34
use crate::display::json::{fmt_err, fmt_ok, fmt_result};
45
use anyhow::Result;
56
use serde_json::json;
@@ -59,3 +60,15 @@ pub fn search_self_post(result: Result<(impl ExactSizeIterator<Item = usize>, us
5960
});
6061
fmt_ok(json)
6162
}
63+
64+
pub fn search_site_post(
65+
entry_iter: Result<impl ExactSizeIterator<Item = SearchResultEntry>>,
66+
) -> String {
67+
let entry_iter = match entry_iter {
68+
Ok(o) => o,
69+
Err(e) => return fmt_err(&e),
70+
};
71+
72+
let entry_vec = entry_iter.collect::<Vec<SearchResultEntry>>();
73+
fmt_ok(entry_vec)
74+
}

src/display/mod.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::api::ing::get_list::IngEntry;
44
use crate::api::news::get_list::NewsEntry;
55
use crate::api::post::get_comment_list::PostCommentEntry;
66
use crate::api::post::get_one::PostEntry;
7+
use crate::api::post::search_site::SearchResultEntry;
78
use crate::api::user::info::UserInfo;
89
use crate::args::{Style, TimeStyle};
910
use crate::infra::result::WrapResult;
@@ -129,6 +130,18 @@ pub fn search_self_post(
129130
}
130131
}
131132

133+
pub fn search_site_post(
134+
style: &Style,
135+
time_style: &TimeStyle,
136+
entry_iter: Result<impl ExactSizeIterator<Item = SearchResultEntry>>,
137+
) -> Result<String> {
138+
match style {
139+
Style::Colorful => colorful::post::search_site_post(time_style, entry_iter),
140+
Style::Normal => normal::post::search_site_post(time_style, entry_iter),
141+
Style::Json => json::post::search_site_post(entry_iter).wrap_ok(),
142+
}
143+
}
144+
132145
pub fn create_post(style: &Style, result: &Result<usize>) -> String {
133146
match style {
134147
Style::Colorful => colorful::fmt_result(result),

src/display/normal/post.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::api::post::get_comment_list::PostCommentEntry;
22
use crate::api::post::get_one::PostEntry;
3+
use crate::api::post::search_site::SearchResultEntry;
34
use crate::args::TimeStyle;
45
use crate::display::normal::fmt_err;
56
use crate::infra::result::WrapResult;
@@ -134,3 +135,34 @@ pub fn search_self_post(
134135
},
135136
)
136137
}
138+
139+
pub fn search_site_post(
140+
time_style: &TimeStyle,
141+
entry_iter: Result<impl ExactSizeIterator<Item = SearchResultEntry>>,
142+
) -> Result<String> {
143+
let entry_iter = match entry_iter {
144+
Ok(o) => o,
145+
Err(e) => return fmt_err(&e).wrap_ok(),
146+
};
147+
148+
entry_iter
149+
.map(|entry| try {
150+
let mut buf = String::new();
151+
{
152+
let buf = &mut buf;
153+
let create_time = display_cnb_time(&entry.create_time, time_style);
154+
writeln!(buf, "{} {}", create_time, entry.url)?;
155+
writeln!(buf, " {}", entry.title)?;
156+
let view_vote_comment_count = format!(
157+
"View {} Vote {} Comment {}",
158+
entry.view_count, entry.vote_count, entry.comment_count
159+
);
160+
writeln!(buf, " {}", view_vote_comment_count)?;
161+
}
162+
buf
163+
})
164+
.try_fold(String::new(), |mut acc, buf: Result<String>| try {
165+
writeln!(&mut acc, "{}", buf?)?;
166+
acc
167+
})
168+
}

src/main.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,14 @@ async fn main() -> Result<()> {
160160
foe.then(|| panic_if_err(&result));
161161
display::search_self_post(style, result)?
162162
}
163+
_ if let Some((kw, skip, take)) = parser::post::search_site_post(&args) => {
164+
let result = Post::new(pat?)
165+
.search_site(skip, take, kw)
166+
.await
167+
.map(|vec | vec.into_iter().dyn_rev(rev));
168+
foe.then(|| panic_if_err(&result));
169+
display::search_site_post(style, time_style, result)?
170+
}
163171
_ if let Some(create_cmd) = parser::post::create_post(&args) => {
164172
let CreateCmd { title, body, publish } = create_cmd;
165173
let id = Post::new(pat?).create(title, body, *publish).await;

0 commit comments

Comments
 (0)