credence_lib/render/catalog/
create.rs

1use super::{
2    super::{
3        super::{configuration::*, util::*},
4        constants::*,
5        rendered_page::*,
6    },
7    annotation::*,
8};
9
10use {
11    ::axum::http::*,
12    compris::normal::*,
13    kutil_http::*,
14    std::{path::*, result::Result},
15    tokio::fs::*,
16};
17
18/// Create catalog.
19pub async fn create_catalog<'annotation, PathT>(
20    annotation: CatalogAnnotation<'annotation>,
21    uri_path: &str,
22    directory: PathT,
23    configuration: &RenderConfiguration,
24) -> Result<Vec<Value>, StatusCode>
25where
26    PathT: AsRef<Path>,
27{
28    let mut catalog = Vec::new();
29
30    let mut files = read_dir(directory).await.map_err_internal_server("read directory")?;
31    while let Some(file) = files.next_entry().await.map_err_internal_server("directory entry")? {
32        let file_path = file.path();
33        let (file_name, file_name_without_extension) = file_name(&file_path);
34        if file_name_without_extension != INDEX {
35            if let Some(rendered_page_type) = configuration.is_rendered_page(&file_name) {
36                let rendered_page = RenderedPage::new_from_file(rendered_page_type, &file_path, configuration)
37                    .await
38                    .map_err_internal_server("read render file")?;
39
40                let title = rendered_page.title(configuration)?;
41                let title: &str = title.as_ref().map(|title| title.as_ref()).unwrap_or(&file_name_without_extension);
42
43                let href = uri_path_join(uri_path, &file_name_without_extension);
44
45                let created = rendered_page
46                    .annotations
47                    .created
48                    .as_ref()
49                    .map(|date_time| date_time.value.timestamp())
50                    .unwrap_or_default();
51
52                let updated = rendered_page
53                    .annotations
54                    .updated
55                    .as_ref()
56                    .map(|date_time| date_time.value.timestamp())
57                    .unwrap_or_default();
58
59                let mut item = Map::new();
60
61                item.value.insert("title".into(), title.into());
62                item.value.insert("href".into(), href.into());
63                item.value.insert("created".into(), created.into());
64                item.value.insert("updated".into(), updated.into());
65
66                for (key, column) in &annotation.extra_columns {
67                    if let Some(value) = rendered_page.annotations.traverse_variable(column) {
68                        item.value.insert((*key).into(), value.clone());
69                    }
70                }
71
72                catalog.push(item.into());
73            }
74        }
75    }
76
77    annotation.sort(&mut catalog);
78
79    Ok(catalog)
80}