Skip to content

Commit c913637

Browse files
authored
Add more metadata; render README.md with Rust (#43)
1 parent 966cb6d commit c913637

File tree

9 files changed

+1687
-62
lines changed

9 files changed

+1687
-62
lines changed

.github/workflows/render.yml

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
name: Render
2+
3+
on:
4+
push:
5+
6+
jobs:
7+
build:
8+
runs-on: ubuntu-latest
9+
10+
permissions:
11+
# Give the default GITHUB_TOKEN write permission to commit and push the
12+
# added or changed files to the repository.
13+
contents: write
14+
15+
steps:
16+
- uses: actions/checkout@v3
17+
18+
- name: Render list
19+
run: make render
20+
21+
- uses: stefanzweifel/[email protected]
22+
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
23+
with:
24+
commit_message: Commit list
25+
commit_user_name: Idiomatic Rust Bot
26+
commit_user_email: [email protected]
27+
commit_author: Idiomatic Rust Bot <[email protected]>

Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.PHONY: render
2+
render:
3+
cargo run --manifest-path=render/Cargo.toml

README.md

+72-62
Large diffs are not rendered by default.

render/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
target/

render/Cargo.lock

+271
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

render/Cargo.toml

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[package]
2+
name = "render"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]
9+
askama = "0.12.1"
10+
indexmap = "2.2.1"
11+
itertools = "0.12.1"
12+
serde = { version = "1.0.196", features = ["serde_derive"] }
13+
serde_json = "1.0.113"

render/src/main.rs

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
use std::fs;
2+
3+
use askama::Template;
4+
use indexmap::IndexMap;
5+
use itertools::Itertools;
6+
use serde::{Deserialize, Serialize};
7+
8+
#[derive(Template)]
9+
#[template(path = "README.md")]
10+
struct ReadmeTemplate {
11+
projects: Vec<Resource>,
12+
workshops: Vec<Resource>,
13+
books: Vec<Resource>,
14+
articles: YearMap,
15+
talks: YearMap,
16+
forum: YearMap,
17+
}
18+
19+
#[derive(Debug, Serialize, Deserialize, Clone)]
20+
struct Resource {
21+
title: String,
22+
url: String,
23+
description: String,
24+
tags: Vec<String>,
25+
official: bool,
26+
year: usize,
27+
#[serde(rename = "difficultyLevel")]
28+
difficulty_level: String,
29+
duration: Option<String>,
30+
#[serde(rename = "interactivityLevel")]
31+
interactivity_level: String,
32+
free: bool,
33+
category: String,
34+
}
35+
36+
type Resources = Vec<Resource>;
37+
38+
type YearMap = IndexMap<usize, Resources>;
39+
40+
fn group_by_year(resources: &Resources, category: &str) -> YearMap {
41+
resources
42+
.iter()
43+
.filter(|r| r.category == category)
44+
.sorted_by_key(|r| r.year)
45+
.rev()
46+
.fold(YearMap::new(), |mut map, r| {
47+
map.entry(r.year).or_insert_with(Vec::new).push(r.clone());
48+
map
49+
})
50+
}
51+
52+
fn sort_by_title(resources: &Resources, category: &str) -> Resources {
53+
resources
54+
.iter()
55+
.filter(|r| r.category == category)
56+
.sorted_by_key(|r| r.title.to_lowercase())
57+
.cloned()
58+
.collect()
59+
}
60+
61+
fn main() -> Result<(), Box<dyn std::error::Error>> {
62+
let file = std::fs::File::open("resources.json")?;
63+
let resources: Resources = serde_json::from_reader(file)?;
64+
65+
let readme = ReadmeTemplate {
66+
projects: sort_by_title(&resources, "project"),
67+
workshops: sort_by_title(&resources, "workshop"),
68+
books: sort_by_title(&resources, "book"),
69+
articles: group_by_year(&resources, "article"),
70+
talks: group_by_year(&resources, "talk"),
71+
forum: group_by_year(&resources, "forum"),
72+
};
73+
74+
fs::write("README.md", readme.render()?)?;
75+
76+
Ok(())
77+
}

0 commit comments

Comments
 (0)