Skip to content

Commit f6e823c

Browse files
committed
Update
1 parent d09e8d1 commit f6e823c

File tree

4 files changed

+101
-43
lines changed

4 files changed

+101
-43
lines changed

.github/workflows/rust.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ jobs:
2020
run: cargo build --release --verbose
2121
- uses: actions/upload-artifact@v4
2222
with:
23-
path: |
24-
target/release/check-cmt
25-
target/release/check-pr
23+
name: check-cmt
24+
path: target/release/check-cmt
25+
- uses: actions/upload-artifact@v4
26+
with:
27+
name: check-pr
28+
path: target/release/check-pr
2629

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@
55

66
## Usage
77

8+
First, compile the binaries of PDFium and place them in the `./lib` directory with the appropriate filename, such as `libpdfium.xxx`.
9+
10+
Then
11+
```sh
12+
cargo run --bin check-pr -d "./path_you_want_to_check" ...
13+
```
14+
Or
815
```sh
9-
cargo install --path .
10-
byrdocs-check -d "./path_you_want_to_check"
16+
cargo run --bin check-cmt -d "./path_you_want_to_check" ...
1117
```

check-cmt/src/main.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -219,21 +219,20 @@ async fn get_files_need_update(s3_obj: &Vec<Object>) -> anyhow::Result<HashSet<S
219219
webp_files.insert(key[..32].to_string());
220220
}
221221
}
222-
println!("Jpg files: {:?}", jpg_files);
223-
println!("Webp files: {:?}", webp_files);
222+
224223
let mut raw_files = HashSet::new();
225224
for item in s3_obj {
226225
let key = item.key.clone().unwrap_or_default();
227226
if key.ends_with(".pdf") || key.ends_with(".zip") {
228227
raw_files.insert(key[..32].to_string());
229228
}
230229
}
231-
println!("Raw files: {:?}", raw_files);
230+
232231
let jpg_diff = raw_files.difference(&jpg_files).cloned().collect::<HashSet<_>>();
233232
let webp_diff = raw_files.difference(&webp_files).cloned().collect::<HashSet<_>>();
234233
let files_need_update = jpg_diff.union(&webp_diff).cloned().collect::<HashSet<_>>();
235234
//Get files need to update
236-
println!("Files need to update: {:?}", files_need_update);
235+
println!("Files need to update: {:#?}", files_need_update);
237236
Ok(files_need_update)
238237
}
239238

@@ -268,6 +267,7 @@ async fn generate_jpg_files() -> anyhow::Result<()> {
268267
Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path("./lib"))
269268
.or_else(|_| Pdfium::bind_to_system_library())?,
270269
);
270+
let mut error_count = 0;
271271
for file in dir.read_dir()? {
272272
let file = file?;
273273
let path = file.path();
@@ -288,15 +288,22 @@ async fn generate_jpg_files() -> anyhow::Result<()> {
288288
)?;
289289
}else{
290290
println!("Failed to load pdf: {:?}", path.to_string_lossy().as_ref());
291+
error_count += 1;
291292
};
292293
}
293294
}//Generate jpg files
295+
296+
if error_count > 0 {
297+
return Err(anyhow::anyhow!("Failed to load {} pdf files", error_count));
298+
}
299+
294300
println!("jpg Files generated");
295301
Ok(())
296302
}
297303

298304
async fn generate_webp_files() -> anyhow::Result<()> {
299305
let dir = Path::new("./tmp2");
306+
let mut count = 0;
300307
for file in dir.read_dir()? {
301308
let file = file?;
302309
let path = file.path();
@@ -316,11 +323,11 @@ async fn generate_webp_files() -> anyhow::Result<()> {
316323

317324
let file_path = Path::new("./tmp3").join(format!("{}.webp", path.file_stem().unwrap().to_str().unwrap()));
318325
let mut file = File::create(file_path.clone()).await?;
319-
println!("file: {:#?}", file_path.to_string_lossy());
320326
file.write_all(&webp_data).await?;
327+
count += 1;
321328
}
322329
}//Generate jpg files
323-
println!("webp Files generated");
330+
println!("webp Files generated: {}", count);
324331
Ok(())
325332
}
326333

check-pr/src/main.rs

Lines changed: 74 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
use std::path::Path;
1+
use anyhow;
2+
use regex;
23
use rusoto_core::HttpClient;
34
use rusoto_s3::S3;
4-
use tokio::{self, io::{AsyncReadExt, BufReader}};
5-
use regex;
6-
use serde_yaml;
75
use serde;
8-
use anyhow;
6+
use serde_yaml;
7+
use std::path::Path;
98
use structopt::StructOpt;
9+
use tokio::{
10+
self,
11+
io::{AsyncReadExt, BufReader},
12+
};
1013

1114
#[derive(StructOpt)]
1215
struct Input {
@@ -18,15 +21,25 @@ struct Input {
1821
backend_url: String,
1922
#[structopt(short = "t", long = "token", help = "Token", required = true)]
2023
backend_token: String,
21-
#[structopt(short = "a", long = "ACCESS_KEY_ID", help = "ACCESS_KEY_ID", required = true)]
24+
#[structopt(
25+
short = "a",
26+
long = "ACCESS_KEY_ID",
27+
help = "ACCESS_KEY_ID",
28+
required = true
29+
)]
2230
assess_key_id: String,
23-
#[structopt(short = "s", long = "SECRET_ACCESS_KEY", help = "SECRET_ACCESS_KEY", required = true)]
31+
#[structopt(
32+
short = "s",
33+
long = "SECRET_ACCESS_KEY",
34+
help = "SECRET_ACCESS_KEY",
35+
required = true
36+
)]
2437
secret_access_key: String,
2538
#[structopt(short = "c", long = "bucket", help = "bucket name", required = true)]
2639
bucket: String,
2740
}
2841

29-
#[derive(serde::Deserialize)]
42+
#[derive(serde::Deserialize, Debug)]
3043
enum Type {
3144
#[serde(rename = "test")]
3245
Test,
@@ -36,26 +49,25 @@ enum Type {
3649
Doc,
3750
}
3851

39-
#[derive(serde::Deserialize)]
52+
#[derive(serde::Deserialize, Debug)]
4053
#[serde(untagged)]
4154
enum Data {
4255
Test(Test),
4356
Book(Book),
4457
Doc(Doc),
45-
4658
}
4759

48-
#[derive(serde::Deserialize)]
60+
#[derive(serde::Deserialize, Debug)]
4961
#[allow(dead_code)]
5062
struct MetaData {
5163
id: String,
5264
url: String,
5365
#[serde(rename = "type")]
5466
type_: Type,
55-
data: Data
67+
data: Data,
5668
}
5769

58-
#[derive(serde::Deserialize)]
70+
#[derive(serde::Deserialize, Debug)]
5971
#[allow(dead_code)]
6072
struct Test {
6173
title: String,
@@ -66,15 +78,15 @@ struct Test {
6678
content: Vec<String>,
6779
}
6880

69-
#[derive(serde::Deserialize)]
81+
#[derive(serde::Deserialize, Debug)]
7082
#[allow(dead_code)]
7183
struct Course {
7284
#[serde(rename = "type")]
7385
type_: Option<String>,
7486
name: Option<String>,
7587
}
7688

77-
#[derive(serde::Deserialize)]
89+
#[derive(serde::Deserialize, Debug)]
7890
#[allow(dead_code)]
7991
struct Book {
8092
title: String,
@@ -86,7 +98,7 @@ struct Book {
8698
filetype: String,
8799
}
88100

89-
#[derive(serde::Deserialize)]
101+
#[derive(serde::Deserialize, Debug)]
90102
#[allow(dead_code)]
91103
struct Doc {
92104
title: String,
@@ -95,7 +107,7 @@ struct Doc {
95107
content: Vec<DocContent>,
96108
}
97109

98-
#[derive(serde::Deserialize)]
110+
#[derive(serde::Deserialize, Debug)]
99111
#[serde(rename_all = "PascalCase")]
100112
enum DocContent {
101113
思维导图,
@@ -146,7 +158,10 @@ async fn main() -> anyhow::Result<()> {
146158

147159
let end_point = input.s3_url;
148160
let http_client = HttpClient::new()?;
149-
let credentials = rusoto_core::credential::StaticProvider::new_minimal(input.assess_key_id, input.secret_access_key);
161+
let credentials = rusoto_core::credential::StaticProvider::new_minimal(
162+
input.assess_key_id,
163+
input.secret_access_key,
164+
);
150165
let region = rusoto_core::Region::Custom {
151166
name: "byr".to_owned(),
152167
endpoint: end_point,
@@ -157,25 +172,41 @@ async fn main() -> anyhow::Result<()> {
157172
..Default::default()
158173
};
159174
let result = s3_client.list_objects_v2(request).await?;
160-
let s3_file_list = result.contents.unwrap().iter().map(|item| item.key.clone().unwrap()).collect::<Vec<_>>();
175+
let s3_file_list = result
176+
.contents
177+
.unwrap()
178+
.iter()
179+
.map(|item| item.key.clone().unwrap())
180+
.collect::<Vec<_>>();
161181

162182
let backend_client = reqwest::Client::new();
163-
let temp_files = backend_client.get(format!("{}/api/file/notPublished", input.backend_url))
183+
let temp_files = backend_client
184+
.get(format!("{}/api/file/notPublished", input.backend_url))
164185
.bearer_auth(input.backend_token)
165186
.send()
166187
.await?
167188
.json::<ApiResult>()
168189
.await?;
169190

191+
let mut success_book = 0;
192+
let mut success_test = 0;
193+
let mut success_doc = 0;
194+
let mut total = 0;
170195
let dir_path = Path::new(&input.dir);
196+
171197
for entry in dir_path.read_dir()? {
198+
total += 1;
172199
let entry = entry?;
200+
if !entry.file_name().to_str().unwrap().ends_with(".yml") {
201+
continue;
202+
}
173203
let path = entry.path();
174204
if path.is_file() {
175-
176205
let file = std::fs::File::open(&path)?;
177206
let metadata: MetaData = serde_yaml::from_reader(file)?;
178-
let url_regex = regex::Regex::new(r"^https://byrdocs\.org/files/[a-fA-F0-9]{32}\.(pdf|zip)$").unwrap();
207+
let url_regex =
208+
regex::Regex::new(r"^https://byrdocs\.org/files/[a-fA-F0-9]{32}\.(pdf|zip)$")
209+
.unwrap();
179210
if !url_regex.is_match(&metadata.url) | !metadata.url.contains(metadata.id.as_str()) {
180211
println!("Invalid URL or id: {}", path.display());
181212
continue;
@@ -190,7 +221,9 @@ async fn main() -> anyhow::Result<()> {
190221
}
191222

192223
for temp_file in &temp_files.files {
193-
if temp_file.file_name.as_str() == format!("{}.pdf", metadata.id) || temp_file.file_name.as_str() == format!("{}.zip", metadata.id) {
224+
if temp_file.file_name.as_str() == format!("{}.pdf", metadata.id)
225+
|| temp_file.file_name.as_str() == format!("{}.zip", metadata.id)
226+
{
194227
match temp_file.status {
195228
Status::Published => {
196229
println!("Published: {}", path.display());
@@ -215,19 +248,28 @@ async fn main() -> anyhow::Result<()> {
215248
}
216249
}
217250
match metadata.data {
218-
Data::Test(test) => {
219-
println!("Test: {}", test.title);
251+
Data::Test(_test) => {
252+
success_test += 1;
220253
}
221-
Data::Book(book) => {
222-
println!("Book: {}", book.title);
254+
Data::Book(_book) => {
255+
success_book += 1;
223256
}
224-
Data::Doc(doc) => {
225-
println!("Doc: {}", doc.title);
257+
Data::Doc(_doc) => {
258+
success_doc += 1;
226259
}
227260
}
228261
}
229262
}
230-
231-
263+
println!(
264+
"Total: {}, Success: {}, Book: {}, Test: {}, Doc: {}",
265+
total,
266+
success_book + success_test + success_doc,
267+
success_book,
268+
success_test,
269+
success_doc
270+
);
271+
if total != success_book + success_test + success_doc {
272+
return Err(anyhow::anyhow!("Some files are invalid"));
273+
}
232274
Ok(())
233-
}
275+
}

0 commit comments

Comments
 (0)