diff --git a/Cargo.lock b/Cargo.lock index 8cabfd9..f455033 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -277,7 +277,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -302,6 +302,12 @@ dependencies = [ "phf_codegen", ] +[[package]] +name = "chunky-vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb7bdea464ae038f09197b82430b921c53619fc8d2bcaf7b151013b3ca008017" + [[package]] name = "convert_case" version = "0.4.0" @@ -320,10 +326,20 @@ dependencies = [ ] [[package]] -name = "core-foundation-sys" -version = "0.8.4" +name = "core-foundation" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" @@ -526,12 +542,32 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "either" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "elsa" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714f766f3556b44e7e4776ad133fcc3445a489517c25c704ace411bb14790194" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "encoding_rs" version = "0.8.33" @@ -549,12 +585,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -592,6 +628,18 @@ dependencies = [ "version_check", ] +[[package]] +name = "filetime" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.3.5", + "windows-sys 0.48.0", +] + [[package]] name = "flate2" version = "1.0.28" @@ -602,12 +650,90 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "fluent-bundle" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e242c601dec9711505f6d5bbff5bedd4b61b2469f2e8bb8e57ee7c9747a87ffd" +dependencies = [ + "fluent-langneg", + "fluent-syntax", + "intl-memoizer", + "intl_pluralrules", + "rustc-hash", + "self_cell 0.10.3", + "smallvec", + "unic-langid", +] + +[[package]] +name = "fluent-fallback" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08fdcccdeb6c01cb085f2bb3420506e6c67f025cee5db047529838c673a7d82b" +dependencies = [ + "async-trait", + "chunky-vec", + "fluent-bundle", + "futures", + "once_cell", + "rustc-hash", + "unic-langid", +] + +[[package]] +name = "fluent-langneg" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "fluent-resmgr" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144b87452708dd3217fdb41aefb74cf261fde09cd055ee2e1f4634b5beb380" +dependencies = [ + "elsa", + "fluent-bundle", + "fluent-fallback", + "futures", + "rustc-hash", + "unic-langid", +] + +[[package]] +name = "fluent-syntax" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0abed97648395c902868fee9026de96483933faa54ea3b40d652f7dfe61ca78" +dependencies = [ + "thiserror", +] + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -617,6 +743,15 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + [[package]] name = "futures" version = "0.3.29" @@ -625,6 +760,7 @@ checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", + "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -735,7 +871,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" dependencies = [ "libc", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -836,7 +972,7 @@ dependencies = [ "tungstenite", "url", "which", - "winreg", + "winreg 0.51.0", ] [[package]] @@ -845,13 +981,19 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "home" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -933,6 +1075,19 @@ dependencies = [ "tokio-io-timeout", ] +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + [[package]] name = "iana-time-zone" version = "0.1.58" @@ -1015,6 +1170,51 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" +[[package]] +name = "inotify" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "intl-memoizer" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c310433e4a310918d6ed9243542a6b83ec1183df95dff8f23f87bb88a264a66f" +dependencies = [ + "type-map", + "unic-langid", +] + +[[package]] +name = "intl_pluralrules" +version = "7.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "is-terminal" version = "0.4.9" @@ -1023,7 +1223,7 @@ checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1050,6 +1250,26 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kqueue" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1070,9 +1290,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" @@ -1157,8 +1377,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", + "log", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1183,7 +1404,9 @@ dependencies = [ [[package]] name = "nanobyte_opentelemetry" -version = "0.1.0" +version = "0.2.2" +source = "sparse+https://git.nanobyte.cz/api/packages/nanobyte/cargo/" +checksum = "a3470844579913374d0a7026b7daf02a1be92e006f089aa908440026fa5b0abf" dependencies = [ "gethostname", "opentelemetry", @@ -1192,6 +1415,7 @@ dependencies = [ "opentelemetry-semantic-conventions", "opentelemetry-stdout", "opentelemetry_sdk", + "reqwest", "rocket", "tracing", "tracing-appender", @@ -1203,6 +1427,67 @@ dependencies = [ "yansi 0.5.1", ] +[[package]] +name = "nanobyte_tera" +version = "0.1.0" +source = "git+https://glpat-Us_EdFTzQLv4shViQXi_:glpat-Us_EdFTzQLv4shViQXi_@gitlab.nanobyte.cz/tools/nanobyte_tera.git?branch=master#75c20a9806663ca04c6f8a7afff64d7b5906d113" +dependencies = [ + "chrono", + "fluent-bundle", + "fluent-resmgr", + "log", + "ovlach_data 0.1.0 (git+https://glpat-Ju_qUN9Yh8qa5rEnd6T7:glpat-Ju_qUN9Yh8qa5rEnd6T7@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git?branch=add_missing_fields)", + "rocket_dyn_templates", + "sha256", + "unic-langid", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "normpath" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec60c60a693226186f5d6edf073232bfb6464ed97eb22cf3b01c1e8198fd97f5" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "notify" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" +dependencies = [ + "bitflags 2.4.1", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio", + "walkdir", + "windows-sys 0.48.0", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1247,6 +1532,50 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "openssl" +version = "0.10.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "opentelemetry" version = "0.21.0" @@ -1372,6 +1701,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "ovlach_data" +version = "0.1.0" +source = "git+https://glpat-Ju_qUN9Yh8qa5rEnd6T7:glpat-Ju_qUN9Yh8qa5rEnd6T7@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git?branch=add_missing_fields#c13748b039d812d3bf1aaa93312699da7b921868" +dependencies = [ + "chrono", + "rocket", + "serde", +] + [[package]] name = "ovlach_data" version = "0.1.0" @@ -1392,7 +1731,11 @@ dependencies = [ "headless_chrome", "log", "nanobyte_opentelemetry", - "ovlach_data", + "nanobyte_tera", + "ovlach_data 0.1.0 (git+ssh://git@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git?branch=add_missing_fields)", + "ovlach_tera", + "phf", + "reqwest", "rocket", "serde", "serde_yaml", @@ -1404,6 +1747,15 @@ dependencies = [ "yansi 0.5.1", ] +[[package]] +name = "ovlach_tera" +version = "0.1.0" +source = "git+https://glpat-_yPuXbEzECyk3FaHudCN:glpat-_yPuXbEzECyk3FaHudCN@gitlab.nanobyte.cz/ondrej/ovlach_tera.git?branch=master#0ab1bbadd76c1336e00b2a38e572048003879ab6" +dependencies = [ + "rocket_dyn_templates", + "serde", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -1422,9 +1774,9 @@ checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.4.1", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -1516,6 +1868,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ + "phf_macros", "phf_shared", ] @@ -1539,6 +1892,19 @@ dependencies = [ "rand", ] +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "phf_shared" version = "0.11.2" @@ -1580,6 +1946,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + [[package]] name = "powerfmt" version = "0.2.0" @@ -1676,6 +2048,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -1750,17 +2131,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] -name = "ring" -version = "0.17.5" +name = "reqwest" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.50.0", +] + +[[package]] +name = "ring" +version = "0.17.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684d5e6e18f669ccebf64a92236bb7db9a34f07be010e3627368182027180866" dependencies = [ "cc", "getrandom", "libc", "spin", "untrusted", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1818,6 +2237,19 @@ dependencies = [ "version_check", ] +[[package]] +name = "rocket_dyn_templates" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04bfc006e547e4f72b760ab861f5943b688aed8a82c4977b5500c98f5d17dbfa" +dependencies = [ + "normpath", + "notify", + "rocket", + "tera", + "walkdir", +] + [[package]] name = "rocket_http" version = "0.5.0" @@ -1852,16 +2284,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] -name = "rustix" -version = "0.38.25" +name = "rustc-hash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.38.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" dependencies = [ "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1907,6 +2345,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -1929,6 +2376,44 @@ dependencies = [ "untrusted", ] +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "self_cell" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d" +dependencies = [ + "self_cell 1.0.2", +] + +[[package]] +name = "self_cell" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e388332cd64eb80cd595a00941baf513caffae8dce9cfd0467fc9c66397dade6" + [[package]] name = "serde" version = "1.0.193" @@ -1969,6 +2454,18 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_yaml" version = "0.9.27" @@ -2004,6 +2501,19 @@ dependencies = [ "digest", ] +[[package]] +name = "sha256" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7895c8ae88588ccead14ff438b939b0c569cd619116f14b4d13fdff7b8333386" +dependencies = [ + "async-trait", + "bytes", + "hex", + "sha2", + "tokio", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -2070,7 +2580,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2099,6 +2609,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "state" version = "0.6.0" @@ -2142,6 +2658,27 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" version = "3.8.1" @@ -2150,9 +2687,9 @@ checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", + "redox_syscall 0.4.1", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2236,6 +2773,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece" +dependencies = [ + "displaydoc", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -2266,7 +2812,7 @@ dependencies = [ "signal-hook-registry", "socket2 0.5.5", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2290,6 +2836,16 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.14" @@ -2538,6 +3094,15 @@ dependencies = [ "utf-8", ] +[[package]] +name = "type-map" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d3364c5e96cb2ad1603037ab253ddd34d7fb72a58bdddf4b7350760fc69a46" +dependencies = [ + "rustc-hash", +] + [[package]] name = "typenum" version = "1.17.0" @@ -2590,6 +3155,24 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" +[[package]] +name = "unic-langid" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "398f9ad7239db44fd0f80fe068d12ff22d78354080332a5077dc6f52f14dcf2f" +dependencies = [ + "unic-langid-impl", +] + +[[package]] +name = "unic-langid-impl" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35bfd2f2b8796545b55d7d3fd3e89a0613f68a0d1c8bc28cb7ff96b411a35ff" +dependencies = [ + "tinystr", +] + [[package]] name = "unic-segment" version = "0.9.0" @@ -2713,6 +3296,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" @@ -2769,6 +3358,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.89" @@ -2798,6 +3399,16 @@ version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +[[package]] +name = "web-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "web-time" version = "0.2.3" @@ -2824,7 +3435,7 @@ dependencies = [ "home", "once_cell", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2864,7 +3475,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -2873,7 +3484,7 @@ version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -2882,7 +3493,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -2891,13 +3511,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -2906,42 +3541,84 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winnow" version = "0.5.19" @@ -2951,6 +3628,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "winreg" version = "0.51.0" @@ -2958,7 +3645,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "937f3df7948156640f46aacef17a70db0de5917bda9c92b0f751f3a955b588fc" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 5142092..8c9eb73 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,11 @@ tokio = { version = "1.34.0", features = ["macros"] } tracing = { version = "0.1.40", features = ["attributes", "std"] } yansi = "0.5.1" tera = "1.19.1" -nanobyte_opentelemetry = { path = "../nanobyte_opentelemetry" } tempfile = "3.8.1" -urlencoding = "2.1.3" \ No newline at end of file +urlencoding = "2.1.3" +nanobyte_opentelemetry = { version = "0.2.2", registry = "gitea", features = ["rocket-reqwest"]} +reqwest = { version = "0.11", features = ["json"] } +phf = { version = "0.11.2", features = ["macros"] } + +nanobyte_tera = { git = "https://glpat-Us_EdFTzQLv4shViQXi_:glpat-Us_EdFTzQLv4shViQXi_@gitlab.nanobyte.cz/tools/nanobyte_tera.git", branch = "master" } +ovlach_tera = { git = "https://glpat-_yPuXbEzECyk3FaHudCN:glpat-_yPuXbEzECyk3FaHudCN@gitlab.nanobyte.cz/ondrej/ovlach_tera.git", branch = "master" } diff --git a/Rocket.toml b/Rocket.toml index 76ba914..6add778 100644 --- a/Rocket.toml +++ b/Rocket.toml @@ -1,2 +1,8 @@ [debug] +static_route = "http://localhost:8001" +cv_backend_path = "http://localhost:8002" + +[default] +static_route = "http://localhost:8001" +cv_backend_path = "http://localhost:8002" port = 8003 \ No newline at end of file diff --git a/resources/cs-CZ/ovlach_frontend b/resources/cs-CZ/ovlach_frontend new file mode 100644 index 0000000..04dd624 --- /dev/null +++ b/resources/cs-CZ/ovlach_frontend @@ -0,0 +1,21 @@ +devops-enginner-web-developer = DevOPS engineer/Backend web developer(TODO do API) +download-cv = Stáhnout životopis +hire-me = Kontakt +about-me = O mě +professional-skills = Jazyky a technologie +work-experience = Zaměstnání +contact = Kontakt +bio = Základní udaje +education = Vzdělání +title-about = O mě +title-skills = Technologie +title-experience = Zaměstnání +title-education = Vzdělání +title-contact = Kontakt +age = Věk +email = E-mail +phone = Telefon +czech = Česky +english = Anglicky +skills-languages = Jazyky +skills-technology = Technologie/Frameworky \ No newline at end of file diff --git a/resources/en-US/ovlach_frontend b/resources/en-US/ovlach_frontend new file mode 100644 index 0000000..d4aaaf6 --- /dev/null +++ b/resources/en-US/ovlach_frontend @@ -0,0 +1,21 @@ +devops-enginner-web-developer = DevOPS engineer/Backend web developer +download-cv = Download CV +hire-me = Hire me +about-me = About me +professional-skills = Professional Skills +education = Education +work-experience = Work experience +contact = Contact +bio = Bio +title-about = About +title-skills = Skills +title-experience = Experience +title-education = Education +title-contact = Contact +age = Age +email = Email +phone = Phone +czech = Czech +english = English +skills-languages = Languages +skills-technology = Technologies/Frameworks \ No newline at end of file diff --git a/src/chromium/rocket.rs b/src/chromium/rocket.rs index 4239add..a451b08 100644 --- a/src/chromium/rocket.rs +++ b/src/chromium/rocket.rs @@ -32,7 +32,6 @@ impl Fairing for Chromium { async fn on_ignite(&self, rocket: Rocket) -> fairing::Result { let new_rocket = rocket.manage(ChromiumCoordinator::new().await); - let coordinator = new_rocket.state::().unwrap(); Ok(new_rocket) } } diff --git a/src/lib.rs b/src/lib.rs index 9603a88..9202ed9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,15 +1,27 @@ use chromium::rocket::Chromium; use nanobyte_opentelemetry::rocket::TracingFairing; -use rocket::{Rocket, Build, routes}; +use rocket::{Rocket, Build, routes, fairing::AdHoc}; +use serde::Deserialize; pub mod routes; mod chromium; mod tools; +mod services; + +#[derive(Deserialize)] +#[serde(crate = "rocket::serde")] +pub struct CVBackendConfig { + cv_backend_path: String, +} + pub fn rocket_builder() -> Rocket { rocket::build() .attach(TracingFairing::ignite()) .attach(Chromium::ignite()) + .attach( + AdHoc::config::() + ) .mount("/", routes![ routes::pdf::render_pdf_cv, routes::pdf::render_html_cv diff --git a/src/routes/pdf.rs b/src/routes/pdf.rs index c155939..7d0141f 100644 --- a/src/routes/pdf.rs +++ b/src/routes/pdf.rs @@ -1,12 +1,15 @@ use headless_chrome::Browser; use headless_chrome::types::PrintToPdfOptions; -use nanobyte_opentelemetry::rocket::TracingSpan; -use rocket::{get, response::stream::ByteStream, fairing::Fairing, fs::NamedFile, futures::TryFutureExt}; +use nanobyte_opentelemetry::rocket::{TracingSpan, RequestId, OtelReqwestClient}; +use ovlach_data::cv::cv::CV; +use reqwest::Client; +use rocket::fs::NamedFile; +use ::rocket::{State, http::Status}; +use ::rocket::get; use tempfile::NamedTempFile; use tera::Context; use tracing::{info_span, error, debug}; -use crate::{chromium::rocket::BrowserHolder, tools::{tera::NanoTera, pdf::PdfStream}}; -use urlencoding::encode; +use crate::{chromium::rocket::BrowserHolder, tools::{tera::NanoTera, pdf::PdfStream, rocket::RequestLanguage}, services::cv::fetch_cv_data_from_backend, CVBackendConfig}; // TODO: request-id fn generate_pdf(browser: Browser, file: &NamedTempFile) -> Vec { @@ -38,29 +41,59 @@ fn generate_pdf(browser: Browser, file: &NamedTempFile) -> Vec { } #[tracing::instrument] -fn render_template(template_name: &str, file: &NamedTempFile, tera: NanoTera) { +fn render_template(template_name: &str, file: &NamedTempFile, tera: NanoTera, cv: CV, language: String) { // TODO: handle errors - tera.0.render_to("two_column.html.tera", &Context::new(), file); + let mut tera_context = Context::new(); + tera_context.insert("cv", &cv); + tera_context.insert("lang", language.as_str()); + + match tera.0.render_to("two_column.html.tera", &tera_context, file) { + Ok(_) => { + debug!("Rendered template to {}", file.path().to_str().unwrap()); + }, + Err(e) => { + error!("Error rendering template {}: {}", &template_name, e); + } + } } -#[get("/cv//output.pdf")] -pub async fn render_pdf_cv(username: &str, browser: BrowserHolder, tera: NanoTera, tracing: TracingSpan) -> PdfStream { +#[get("/cv///output.pdf")] +pub async fn render_pdf_cv(username: &str, tera: NanoTera, tracing: TracingSpan, request_client: OtelReqwestClient, + cv_config: &State, language: RequestLanguage, browser: BrowserHolder) -> Result { let entered_span = tracing.0.enter(); - let file = tempfile::Builder::new().suffix(".html").tempfile().unwrap(); - render_template("two_column", &file, tera); - let span = info_span!("render_pdf", username = username); - let pdf = span.in_scope(||{ - generate_pdf(browser.browser, &file) - }); - drop(entered_span); - PdfStream::new(pdf) + match fetch_cv_data_from_backend(cv_config.cv_backend_path.clone(), request_client.0).await { + Ok(cv_data) => { + let file = tempfile::Builder::new().suffix(".html").tempfile().unwrap(); + render_template("two_column", &file, tera, cv_data, language.language); + let span = info_span!("render_pdf", username = username); + let pdf = span.in_scope(||{ + generate_pdf(browser.browser, &file) + }); + drop(entered_span); + Ok(PdfStream::new(pdf)) + }, + Err(e) => { + error!("Error fetching cv data: {:?}", e); + Err(Status::InternalServerError) + } + } } /// Route only for debuging -#[get("/cv//output.html")] -pub async fn render_html_cv(username: &str, tera: NanoTera, tracing: TracingSpan) -> NamedFile { - let entered_span = tracing.0.enter(); - let file = tempfile::Builder::new().suffix(".html").tempfile().unwrap(); - render_template("two_column", &file, tera); - NamedFile::open(file.path()).await.unwrap() +#[get("/cv///output.html")] +pub async fn render_html_cv(username: &str, tera: NanoTera, tracing: TracingSpan, request_client: OtelReqwestClient, + cv_config: &State, language: RequestLanguage) -> Result { + let _ = tracing.0.enter(); + match fetch_cv_data_from_backend(cv_config.cv_backend_path.clone(), request_client.0).await { + Ok(cv_data) => { + let file = tempfile::Builder::new().suffix(".html").tempfile().unwrap(); + render_template("two_column", &file, tera, cv_data, language.language); + Ok(NamedFile::open(file.path()).await.unwrap()) + }, + Err(e) => { + error!("Error fetching cv data: {:?}", e); + Err(Status::InternalServerError) + } + } + } \ No newline at end of file diff --git a/src/services/cv.rs b/src/services/cv.rs new file mode 100644 index 0000000..90c62b0 --- /dev/null +++ b/src/services/cv.rs @@ -0,0 +1,23 @@ +use ovlach_data::cv::cv::CV; +use reqwest::Client; + + +#[derive(Debug)] +pub enum FetchError { + ReqwestError(reqwest::Error) +} + +impl From for FetchError { + fn from(e: reqwest::Error) -> Self { + FetchError::ReqwestError(e) + } +} + +pub async fn fetch_cv_data_from_backend(backend_host: String, client: Client) -> Result { + let resp = client + .get(format!("{}/{}", backend_host, "/api/cv/ovlach")).send() + .await? + .json::() + .await?; + Ok(resp) +} \ No newline at end of file diff --git a/src/services/mod.rs b/src/services/mod.rs new file mode 100644 index 0000000..34a6fa2 --- /dev/null +++ b/src/services/mod.rs @@ -0,0 +1 @@ +pub mod cv; \ No newline at end of file diff --git a/src/tools/mod.rs b/src/tools/mod.rs index d53bde8..5dfe3ff 100644 --- a/src/tools/mod.rs +++ b/src/tools/mod.rs @@ -1,2 +1,3 @@ pub mod tera; -pub mod pdf; \ No newline at end of file +pub mod pdf; +pub(crate) mod rocket; \ No newline at end of file diff --git a/src/tools/rocket.rs b/src/tools/rocket.rs new file mode 100644 index 0000000..400df72 --- /dev/null +++ b/src/tools/rocket.rs @@ -0,0 +1,26 @@ +use phf::phf_map; +use rocket::request::FromParam; + +pub struct RequestLanguage { + pub language: String, +} + +static LANG_TO_CODES: phf::Map<&'static str, &'static str> = phf_map! { + "cs" => "cs-CZ", + "en" => "en-US", +}; + +impl<'r> FromParam<'r> for RequestLanguage { + type Error = &'r str; + + fn from_param(param: &'r str) -> Result { + match LANG_TO_CODES.get(param) { + Some(val) => Ok(RequestLanguage { + language: val.to_string(), + }), + None => Ok(RequestLanguage { + language: LANG_TO_CODES["en"].to_string(), + }), + } + } +} diff --git a/src/tools/tera.rs b/src/tools/tera.rs index e47c69c..a78861a 100644 --- a/src/tools/tera.rs +++ b/src/tools/tera.rs @@ -1,5 +1,9 @@ +use std::{collections::HashMap}; + +use nanobyte_tera::{l18n::translate_filter, date::{calculate_age, get_year}, string::insert_space_every, gravatar::gravatar_link}; +use ovlach_tera::entity::lang_entity; use rocket::{request::{FromRequest, Outcome}, Request}; -use tera::Tera; +use tera::{Tera, Value, Error}; #[derive(Debug)] pub struct NanoTera(pub Tera); @@ -11,6 +15,33 @@ impl<'r> FromRequest<'r> for NanoTera { type Error = (); async fn from_request(request: &'r Request<'_>) -> Outcome { - rocket::outcome::Outcome::Success(NanoTera(Tera::new("templates/*").unwrap())) + let mut tera = Tera::new("templates/*").unwrap(); + tera.register_filter("translate", translate_filter); + tera.register_filter("calculate_age", calculate_age); + tera.register_filter("insert_space_every", insert_space_every); + tera.register_filter("gravatar_link", gravatar_link); + // filters specific to API + tera.register_filter("lang_entity", lang_entity); + tera.register_filter("format_date", get_year); // deprecated + tera.register_filter("get_year", get_year); + tera.register_filter("strip_proto", strip_proto); + rocket::outcome::Outcome::Success(NanoTera(tera)) } -} \ No newline at end of file +} + + +/// Strip protocol from URL (value) +pub fn strip_proto( + tera_value: &Value, + _: &HashMap +) -> Result { + let value = tera_value.as_str().unwrap(); + if value.starts_with("http://") { + Ok(Value::String(value.strip_prefix("http://").unwrap().to_string())) + } else if value.starts_with("https://") { + Ok(Value::String(value.strip_prefix("https://").unwrap().to_string())) + } else { + Ok(Value::String(value.to_string())) + } +} + diff --git a/templates/two_column.html.tera b/templates/two_column.html.tera index 6c5e659..dc3a47d 100644 --- a/templates/two_column.html.tera +++ b/templates/two_column.html.tera @@ -113,6 +113,90 @@ order: 0; } + .flex-container-skills { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: normal; + align-items: normal; + align-content: normal; + width: 99%; + } + + .section-header .flex-container-skills { + width: 100%; + } + + .header { + padding-top: 1em; + } + + .flex-items-skills:nth-child(1) { + display: block; + flex-grow: 0; + flex-shrink: 1; + flex-basis: auto; + align-self: auto; + width: 50%; + order: 0; + } + + .flex-items-skills:nth-child(2) { + display: block; + flex-grow: 0; + flex-shrink: 1; + flex-basis: auto; + text-align: left; + align-self: auto; + width: 50%; + order: 0; + } + + .tech-name { + font-weight: 800; + } + + .tech-level { + } + + .job p { + margin: 0; + padding: 0; + } + + .job:nth-child(n+3) { + padding-top: 10px; + margin: 0; + } + + + .contact-bar { + font-size: 11pt; + padding-left: 1em; + color: black; + } + + .contact-bar i::after{ + content: "\a"; + white-space: pre; + } + + .photo { + padding-bottom: 1em; + } + + .contact-bar:first-child { + padding-top: 2em; + } + + .email{ + + } + + .icon { + height: 1em; + vertical-align:middle; + } @@ -120,78 +204,134 @@

Ondřej Vlach

-
Software engineer
+
{{ "devops-enginner-web-developer" | translate(lang=lang) }}
-

Experience

-
-
-
-
-
Title
-
Company
-
PHP HTML Aholamora Snake
-

- baklklbkalkblaklkb lakbl aklkbl akblka lkblakbla -

+
+
+

{{ "skills-languages" | translate(lang=lang) }}

-
-
Location
-
Dates
+
+

{{ "skills-technology" | translate(lang=lang) }}

+
+
+ {% for skill in cv.skills %} + {% if skill.techtype == "LANGUAGE" %} +
+ {{ skill.name }} ({{ skill.skill | lower}}) +
+ {% endif %} + {% endfor %} +
+
+ {% for skill in cv.skills %} + {% if skill.techtype == "TECHNOLOGY" %} +
+ {{ skill.name }} ({{ skill.skill | lower}}) +
+ {% endif %} + {% endfor %} +
+
-

Experience

+

{{ "work-experience" | translate(lang=lang) }}

+ {% for job in cv.jobs %}
-
Title
-
Company
-
PHP HTML Aholamora Snake
+
{{ job.title }}
+
{{ job.languages }}

- baklklbkalkblaklkb lakbl aklkbl akblka lkblakbla + {{ job.description | lang_entity(lang=lang) }}

-
Location
-
Dates
+
@{{ job.company }}
+
+ {% if job.from | format_date(type="job") != job.from | format_date(type="job") %} +
{{ job.from | format_date(type="job") }} - {{ job.to | format_date(type="job") }}
+ {% else %} +
{{ job.from | format_date(type="job") }}
+ {% endif %} +
+ {% endfor %}
-

Experience

+

{{ "education" | translate(lang=lang) }}

+ {% for education in cv.education %}
-
Title
-
Company
-
PHP HTML Aholamora Snake
-

- baklklbkalkblaklkb lakbl aklkbl akblka lkblakbla -

+ {% if education.degree %} +
{{ education.degree | lang_entity(lang=lang) }}
+ {% else %} +
{{ education.school }}
+ {% endif %} + {% if education.description %} +

+ + {{ education.description | lang_entity(lang=lang) }} +

+ {% endif %}
+
-
Location
-
Dates
+ {% if education.degree %} +
@{{ education.school }}
+ {% endif %} +
{{ education.from | format_date(type="job") }} - {{ education.to | format_date(type="job") }}
+ {% endfor %}
- Photo2342342314213 423142342314213423 -
- L - +
+ +
+ {% if cv.person.social.facebook %} + {{ cv.person.social.facebook | strip_proto }} + {% endif %} + {% if cv.person.social.github %} + + + {{ cv.person.social.github | strip_proto }} + + {% endif %} + {% if cv.person.social.linkedin %} + {{ cv.person.social.linikedin | strip_proto }} + {% endif %} + {% if cv.person.social.instagram %} + {{ cv.person.social.instagram | strip_proto }} + {% endif %} + {% if cv.person.social.mastodon %} + + Mastodon + {{ cv.person.social.mastodon | strip_proto }} + {% endif %} + + + Phone + +{{cv.person.phone | insert_space_every(times=3)}} +