a much better camp_form.rs setup
This commit is contained in:
		
							parent
							
								
									7c12830b2d
								
							
						
					
					
						commit
						4a8325aa35
					
				
					 5 changed files with 551 additions and 85 deletions
				
			
		
							
								
								
									
										367
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										367
									
								
								Cargo.lock
									
										
									
										generated
									
									
									
								
							| 
						 | 
				
			
			@ -282,6 +282,33 @@ version = "0.2.16"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "android-tzdata"
 | 
			
		||||
version = "0.1.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "android_system_properties"
 | 
			
		||||
version = "0.1.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "libc",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "anyhow"
 | 
			
		||||
version = "1.0.86"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "arc-swap"
 | 
			
		||||
version = "1.7.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "async-channel"
 | 
			
		||||
version = "1.8.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -488,6 +515,18 @@ version = "1.0.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "chrono"
 | 
			
		||||
version = "0.4.38"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "android-tzdata",
 | 
			
		||||
 "iana-time-zone",
 | 
			
		||||
 "num-traits",
 | 
			
		||||
 "windows-targets 0.52.5",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "chumsky"
 | 
			
		||||
version = "0.9.3"
 | 
			
		||||
| 
						 | 
				
			
			@ -612,6 +651,17 @@ dependencies = [
 | 
			
		|||
 "syn 2.0.43",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "derivative"
 | 
			
		||||
version = "2.2.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 1.0.109",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "derive_more"
 | 
			
		||||
version = "0.99.17"
 | 
			
		||||
| 
						 | 
				
			
			@ -625,6 +675,12 @@ dependencies = [
 | 
			
		|||
 "syn 1.0.109",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "destructure_traitobject"
 | 
			
		||||
version = "0.2.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "digest"
 | 
			
		||||
version = "0.10.7"
 | 
			
		||||
| 
						 | 
				
			
			@ -673,6 +729,12 @@ dependencies = [
 | 
			
		|||
 "termcolor",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "equivalent"
 | 
			
		||||
version = "1.0.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "errno"
 | 
			
		||||
version = "0.3.1"
 | 
			
		||||
| 
						 | 
				
			
			@ -904,7 +966,7 @@ dependencies = [
 | 
			
		|||
 "futures-sink",
 | 
			
		||||
 "futures-util",
 | 
			
		||||
 "http",
 | 
			
		||||
 "indexmap",
 | 
			
		||||
 "indexmap 1.9.3",
 | 
			
		||||
 "slab",
 | 
			
		||||
 "tokio",
 | 
			
		||||
 "tokio-util",
 | 
			
		||||
| 
						 | 
				
			
			@ -1030,6 +1092,29 @@ dependencies = [
 | 
			
		|||
 "tokio-native-tls",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "iana-time-zone"
 | 
			
		||||
version = "0.1.60"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "android_system_properties",
 | 
			
		||||
 "core-foundation-sys",
 | 
			
		||||
 "iana-time-zone-haiku",
 | 
			
		||||
 "js-sys",
 | 
			
		||||
 "wasm-bindgen",
 | 
			
		||||
 "windows-core",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "iana-time-zone-haiku"
 | 
			
		||||
version = "0.1.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cc",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "ident_case"
 | 
			
		||||
version = "1.0.1"
 | 
			
		||||
| 
						 | 
				
			
			@ -1056,6 +1141,16 @@ dependencies = [
 | 
			
		|||
 "hashbrown 0.12.3",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "indexmap"
 | 
			
		||||
version = "2.2.6"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "equivalent",
 | 
			
		||||
 "hashbrown 0.14.3",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "instant"
 | 
			
		||||
version = "0.1.12"
 | 
			
		||||
| 
						 | 
				
			
			@ -1209,9 +1304,44 @@ version = "0.4.20"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "serde",
 | 
			
		||||
 "value-bag",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "log-mdc"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "log4rs"
 | 
			
		||||
version = "1.3.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "0816135ae15bd0391cf284eab37e6e3ee0a6ee63d2ceeb659862bd8d0a984ca6"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "anyhow",
 | 
			
		||||
 "arc-swap",
 | 
			
		||||
 "chrono",
 | 
			
		||||
 "derivative",
 | 
			
		||||
 "fnv",
 | 
			
		||||
 "humantime",
 | 
			
		||||
 "libc",
 | 
			
		||||
 "log",
 | 
			
		||||
 "log-mdc",
 | 
			
		||||
 "once_cell",
 | 
			
		||||
 "parking_lot",
 | 
			
		||||
 "rand",
 | 
			
		||||
 "serde",
 | 
			
		||||
 "serde-value",
 | 
			
		||||
 "serde_json",
 | 
			
		||||
 "serde_yaml",
 | 
			
		||||
 "thiserror",
 | 
			
		||||
 "thread-id",
 | 
			
		||||
 "typemap-ors",
 | 
			
		||||
 "winapi",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "markup"
 | 
			
		||||
version = "0.15.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -1238,6 +1368,30 @@ version = "0.1.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "maud"
 | 
			
		||||
version = "0.26.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "df518b75016b4289cdddffa1b01f2122f4a49802c93191f3133f6dc2472ebcaa"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "actix-web",
 | 
			
		||||
 "futures-util",
 | 
			
		||||
 "itoa",
 | 
			
		||||
 "maud_macros",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "maud_macros"
 | 
			
		||||
version = "0.26.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "fa453238ec218da0af6b11fc5978d3b5c3a45ed97b722391a2a11f3306274e18"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro-error",
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 2.0.43",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "memchr"
 | 
			
		||||
version = "2.7.1"
 | 
			
		||||
| 
						 | 
				
			
			@ -1315,6 +1469,15 @@ dependencies = [
 | 
			
		|||
 "minimal-lexical",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "num-traits"
 | 
			
		||||
version = "0.2.19"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "autocfg",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "num_cpus"
 | 
			
		||||
version = "1.15.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -1375,6 +1538,15 @@ dependencies = [
 | 
			
		|||
 "vcpkg",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "ordered-float"
 | 
			
		||||
version = "2.10.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "num-traits",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "parking"
 | 
			
		||||
version = "2.1.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -1462,6 +1634,29 @@ version = "0.2.17"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "proc-macro-error"
 | 
			
		||||
version = "1.0.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro-error-attr",
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "version_check",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "proc-macro-error-attr"
 | 
			
		||||
version = "1.0.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "version_check",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "proc-macro2"
 | 
			
		||||
version = "1.0.76"
 | 
			
		||||
| 
						 | 
				
			
			@ -1695,9 +1890,33 @@ checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
 | 
			
		|||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "serde"
 | 
			
		||||
version = "1.0.163"
 | 
			
		||||
version = "1.0.193"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2"
 | 
			
		||||
checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "serde_derive",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "serde-value"
 | 
			
		||||
version = "0.7.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "ordered-float",
 | 
			
		||||
 "serde",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "serde_derive"
 | 
			
		||||
version = "1.0.193"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 2.0.43",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "serde_json"
 | 
			
		||||
| 
						 | 
				
			
			@ -1731,6 +1950,19 @@ dependencies = [
 | 
			
		|||
 "serde",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "serde_yaml"
 | 
			
		||||
version = "0.9.29"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a15e0ef66bf939a7c890a0bf6d5a733c70202225f9888a89ed5c62298b019129"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "indexmap 2.2.6",
 | 
			
		||||
 "itoa",
 | 
			
		||||
 "ryu",
 | 
			
		||||
 "serde",
 | 
			
		||||
 "unsafe-libyaml",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "sha1"
 | 
			
		||||
version = "0.10.5"
 | 
			
		||||
| 
						 | 
				
			
			@ -1862,7 +2094,9 @@ dependencies = [
 | 
			
		|||
 "futures-util",
 | 
			
		||||
 "lettre",
 | 
			
		||||
 "log",
 | 
			
		||||
 "log4rs",
 | 
			
		||||
 "markup",
 | 
			
		||||
 "maud",
 | 
			
		||||
 "reqwest",
 | 
			
		||||
 "sanitize-filename",
 | 
			
		||||
 "serde",
 | 
			
		||||
| 
						 | 
				
			
			@ -1870,6 +2104,36 @@ dependencies = [
 | 
			
		|||
 "uuid",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "thiserror"
 | 
			
		||||
version = "1.0.55"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "6e3de26b0965292219b4287ff031fcba86837900fe9cd2b34ea8ad893c0953d2"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "thiserror-impl",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "thiserror-impl"
 | 
			
		||||
version = "1.0.55"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "268026685b2be38d7103e9e507c938a1fcb3d7e6eb15e87870b617bf37b6d581"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 2.0.43",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "thread-id"
 | 
			
		||||
version = "4.2.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "f0ec81c46e9eb50deaa257be2f148adf052d1fb7701cfd55ccfab2525280b70b"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "libc",
 | 
			
		||||
 "winapi",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "time"
 | 
			
		||||
version = "0.3.21"
 | 
			
		||||
| 
						 | 
				
			
			@ -1986,6 +2250,15 @@ version = "0.2.4"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "typemap-ors"
 | 
			
		||||
version = "1.0.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a68c24b707f02dd18f1e4ccceb9d49f2058c2fb86384ef9972592904d7a28867"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "unsafe-any-ors",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "typenum"
 | 
			
		||||
version = "1.16.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -2022,6 +2295,21 @@ dependencies = [
 | 
			
		|||
 "tinyvec",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "unsafe-any-ors"
 | 
			
		||||
version = "1.0.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "e0a303d30665362d9680d7d91d78b23f5f899504d4f08b3c4cf08d055d87c0ad"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "destructure_traitobject",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "unsafe-libyaml"
 | 
			
		||||
version = "0.2.11"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "url"
 | 
			
		||||
version = "2.5.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -2186,6 +2474,15 @@ version = "0.4.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows-core"
 | 
			
		||||
version = "0.52.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "windows-targets 0.52.5",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows-sys"
 | 
			
		||||
version = "0.42.0"
 | 
			
		||||
| 
						 | 
				
			
			@ -2249,6 +2546,22 @@ dependencies = [
 | 
			
		|||
 "windows_x86_64_msvc 0.48.0",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows-targets"
 | 
			
		||||
version = "0.52.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "windows_aarch64_gnullvm 0.52.5",
 | 
			
		||||
 "windows_aarch64_msvc 0.52.5",
 | 
			
		||||
 "windows_i686_gnu 0.52.5",
 | 
			
		||||
 "windows_i686_gnullvm",
 | 
			
		||||
 "windows_i686_msvc 0.52.5",
 | 
			
		||||
 "windows_x86_64_gnu 0.52.5",
 | 
			
		||||
 "windows_x86_64_gnullvm 0.52.5",
 | 
			
		||||
 "windows_x86_64_msvc 0.52.5",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_aarch64_gnullvm"
 | 
			
		||||
version = "0.42.2"
 | 
			
		||||
| 
						 | 
				
			
			@ -2261,6 +2574,12 @@ version = "0.48.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_aarch64_gnullvm"
 | 
			
		||||
version = "0.52.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_aarch64_msvc"
 | 
			
		||||
version = "0.42.2"
 | 
			
		||||
| 
						 | 
				
			
			@ -2273,6 +2592,12 @@ version = "0.48.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_aarch64_msvc"
 | 
			
		||||
version = "0.52.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_i686_gnu"
 | 
			
		||||
version = "0.42.2"
 | 
			
		||||
| 
						 | 
				
			
			@ -2285,6 +2610,18 @@ version = "0.48.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_i686_gnu"
 | 
			
		||||
version = "0.52.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_i686_gnullvm"
 | 
			
		||||
version = "0.52.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_i686_msvc"
 | 
			
		||||
version = "0.42.2"
 | 
			
		||||
| 
						 | 
				
			
			@ -2297,6 +2634,12 @@ version = "0.48.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_i686_msvc"
 | 
			
		||||
version = "0.52.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_x86_64_gnu"
 | 
			
		||||
version = "0.42.2"
 | 
			
		||||
| 
						 | 
				
			
			@ -2309,6 +2652,12 @@ version = "0.48.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_x86_64_gnu"
 | 
			
		||||
version = "0.52.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_x86_64_gnullvm"
 | 
			
		||||
version = "0.42.2"
 | 
			
		||||
| 
						 | 
				
			
			@ -2321,6 +2670,12 @@ version = "0.48.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_x86_64_gnullvm"
 | 
			
		||||
version = "0.52.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_x86_64_msvc"
 | 
			
		||||
version = "0.42.2"
 | 
			
		||||
| 
						 | 
				
			
			@ -2333,6 +2688,12 @@ version = "0.48.0"
 | 
			
		|||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "windows_x86_64_msvc"
 | 
			
		||||
version = "0.52.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "winreg"
 | 
			
		||||
version = "0.10.1"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,3 +21,5 @@ uuid = "1.6.1"
 | 
			
		|||
sanitize-filename = "0.5.0"
 | 
			
		||||
lettre = { version = "0.11.3", features = ["smtp-transport"] }
 | 
			
		||||
markup = "0.15.0"
 | 
			
		||||
maud = { version = "0.26.0", features = ["actix-web"] }
 | 
			
		||||
log4rs = "1.3.0"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,13 +1,15 @@
 | 
			
		|||
use actix_multipart::form::{json, text::Text, MultipartForm};
 | 
			
		||||
use actix_web::{post, HttpResponse};
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
 | 
			
		||||
use actix_multipart::form::{text::Text, MultipartForm};
 | 
			
		||||
use actix_web::{http::StatusCode, post, HttpResponse, HttpResponseBuilder};
 | 
			
		||||
use lettre::{
 | 
			
		||||
    message::MultiPart,
 | 
			
		||||
    transport::smtp::authentication::{Credentials, Mechanism},
 | 
			
		||||
    Message, SmtpTransport, Transport,
 | 
			
		||||
};
 | 
			
		||||
use reqwest::Request;
 | 
			
		||||
 | 
			
		||||
use super::errors::ApiError;
 | 
			
		||||
use maud::html;
 | 
			
		||||
use maud::DOCTYPE;
 | 
			
		||||
use reqwest::{Client, Error};
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, MultipartForm, Default)]
 | 
			
		||||
struct CampForm {
 | 
			
		||||
| 
						 | 
				
			
			@ -19,6 +21,7 @@ struct CampForm {
 | 
			
		|||
    parent_first_name: Option<Text<String>>,
 | 
			
		||||
    #[multipart(rename = "parent-last-name")]
 | 
			
		||||
    parent_last_name: Option<Text<String>>,
 | 
			
		||||
    #[multipart(rename = "birth-date")]
 | 
			
		||||
    birthdate: Option<Text<String>>,
 | 
			
		||||
    gender: Option<Text<String>>,
 | 
			
		||||
    street: Option<Text<String>>,
 | 
			
		||||
| 
						 | 
				
			
			@ -34,6 +37,8 @@ struct CampForm {
 | 
			
		|||
    allergies: Option<Text<String>>,
 | 
			
		||||
    week: Option<Text<String>>,
 | 
			
		||||
    registration: Option<Text<String>>,
 | 
			
		||||
    #[multipart(rename = "health-form")]
 | 
			
		||||
    health_form: Option<Text<String>>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[post("/camp-form")]
 | 
			
		||||
| 
						 | 
				
			
			@ -139,13 +144,23 @@ pub async fn camp_form(MultipartForm(form): MultipartForm<CampForm>) -> HttpResp
 | 
			
		|||
        .unwrap_or(&Text(String::from("")))
 | 
			
		||||
        .0
 | 
			
		||||
        .clone();
 | 
			
		||||
    let health = form
 | 
			
		||||
        .health_form
 | 
			
		||||
        .as_ref()
 | 
			
		||||
        .unwrap_or(&Text(String::from("")))
 | 
			
		||||
        .0
 | 
			
		||||
        .clone();
 | 
			
		||||
    let reg = registration.clone();
 | 
			
		||||
 | 
			
		||||
    log::info!("Sending post to database");
 | 
			
		||||
 | 
			
		||||
    log::info!("{first} {last} signed up for camp!");
 | 
			
		||||
    let email = markup::new! {
 | 
			
		||||
        @markup::doctype()
 | 
			
		||||
    let email = html! {
 | 
			
		||||
        (DOCTYPE)
 | 
			
		||||
            meta charset="utf-8";
 | 
			
		||||
            html {
 | 
			
		||||
                head {
 | 
			
		||||
                    title { @format!("{} {} signed up for camp!", first, last) }
 | 
			
		||||
                    title { (first) " " (last) " signed up for camp!" }
 | 
			
		||||
                    style {
 | 
			
		||||
                        "table { border-collapse: collapse; width: 100% }"
 | 
			
		||||
                            "td, th { padding: 8px }"
 | 
			
		||||
| 
						 | 
				
			
			@ -156,68 +171,72 @@ pub async fn camp_form(MultipartForm(form): MultipartForm<CampForm>) -> HttpResp
 | 
			
		|||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                body {
 | 
			
		||||
                    h1 { @format!("Camp form for {} {}!", first, last) }
 | 
			
		||||
                    h1 { "Camp form for " (first) " " (last) }
 | 
			
		||||
                    hr;
 | 
			
		||||
                    table {
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Name" }
 | 
			
		||||
                            td { @format!("{} {}", first, last) }
 | 
			
		||||
                            td { (first) " " (last) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Parent" }
 | 
			
		||||
                            td { @parent }
 | 
			
		||||
                            td { (parent) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Birthdate" }
 | 
			
		||||
                            td { @birthdate }
 | 
			
		||||
                            td { (birthdate) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Gender" }
 | 
			
		||||
                            td { @gender }
 | 
			
		||||
                            td { (gender) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Street" }
 | 
			
		||||
                            td { @street }
 | 
			
		||||
                            td { (street) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "City" }
 | 
			
		||||
                            td { @city }
 | 
			
		||||
                            td { (city) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "State" }
 | 
			
		||||
                            td { @state }
 | 
			
		||||
                            td { (state) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Zip" }
 | 
			
		||||
                            td { @zip }
 | 
			
		||||
                            td { (zip) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Parent Phone" }
 | 
			
		||||
                            td { @parent_phone }
 | 
			
		||||
                            td { (parent_phone) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Parent Email" }
 | 
			
		||||
                            td { @parent_email }
 | 
			
		||||
                            td { (parent_email) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Grade" }
 | 
			
		||||
                            td { @grade }
 | 
			
		||||
                            td { (grade) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Camper Allergies" }
 | 
			
		||||
                            td { @allergies }
 | 
			
		||||
                            td { (allergies) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "T-Shirt Size" }
 | 
			
		||||
                            td { @shirt }
 | 
			
		||||
                            td { (shirt) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Week Choice" }
 | 
			
		||||
                            td { @week }
 | 
			
		||||
                            td { (week) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Health Form" }
 | 
			
		||||
                            td { (health) }
 | 
			
		||||
                        }
 | 
			
		||||
                        tr {
 | 
			
		||||
                            th { "Registration" }
 | 
			
		||||
                            td { @registration }
 | 
			
		||||
                            td { (registration) }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -225,7 +244,7 @@ pub async fn camp_form(MultipartForm(form): MultipartForm<CampForm>) -> HttpResp
 | 
			
		|||
    };
 | 
			
		||||
    let multi = MultiPart::alternative_plain_html(
 | 
			
		||||
        String::from("A camp form was filled out!"),
 | 
			
		||||
        email.to_string(),
 | 
			
		||||
        email.into_string(),
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    if let Ok(m) = Message::builder()
 | 
			
		||||
| 
						 | 
				
			
			@ -249,78 +268,139 @@ pub async fn camp_form(MultipartForm(form): MultipartForm<CampForm>) -> HttpResp
 | 
			
		|||
            .authentication(vec![Mechanism::Plain])
 | 
			
		||||
            .build();
 | 
			
		||||
        match sender.send(&m) {
 | 
			
		||||
            Ok(res) => log::info!("{:?}", res),
 | 
			
		||||
            Ok(res) => log::info!(
 | 
			
		||||
                "Successfully sent email to server with this response: {:?}",
 | 
			
		||||
                res
 | 
			
		||||
            ),
 | 
			
		||||
            Err(e) => log::error!("{e}"),
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        log::info!("Email incorrect");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    match reg.as_str() {
 | 
			
		||||
    match store_camp_form(form).await {
 | 
			
		||||
        Ok(_) => log::info!("Successfully posted to nextcloud tables"),
 | 
			
		||||
        Err(e) => log::error!("Error in posting camp data: {:?}", e),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    match health.as_str() {
 | 
			
		||||
        "now" => {
 | 
			
		||||
            log::info!("Sending them to pay for registration now");
 | 
			
		||||
            log::info!("Sending them to fill out the health form");
 | 
			
		||||
            HttpResponse::Ok()
 | 
			
		||||
                .insert_header(("Access-Control-Expose-Headers", "*"))
 | 
			
		||||
                .insert_header((
 | 
			
		||||
                    "HX-Redirect",
 | 
			
		||||
                    "https://secure.myvanco.com/L-Z772/campaign/C-13JPJ",
 | 
			
		||||
                    format!(
 | 
			
		||||
                        "https://tfcconnection.org/camp-health-form/?registration={}",
 | 
			
		||||
                        reg.as_str()
 | 
			
		||||
                    ),
 | 
			
		||||
                ))
 | 
			
		||||
                .finish()
 | 
			
		||||
        }
 | 
			
		||||
        "full" => {
 | 
			
		||||
            log::info!("Sending them to pay for the full registration now");
 | 
			
		||||
            HttpResponse::Ok()
 | 
			
		||||
                .insert_header(("Access-Control-Expose-Headers", "*"))
 | 
			
		||||
                .insert_header((
 | 
			
		||||
                    "HX-Redirect",
 | 
			
		||||
                    "https://secure.myvanco.com/L-Z772/campaign/C-13JQE",
 | 
			
		||||
                ))
 | 
			
		||||
                .finish()
 | 
			
		||||
        }
 | 
			
		||||
        "later" => {
 | 
			
		||||
            log::info!("{} would like to pay later", full_name);
 | 
			
		||||
            let html = markup::new! {
 | 
			
		||||
                div {
 | 
			
		||||
                    class { "mt-8" }
 | 
			
		||||
                    h2 {
 | 
			
		||||
                        @format!("Thank you, {}!", full_name)
 | 
			
		||||
        "later" => match reg.as_str() {
 | 
			
		||||
            "now" => {
 | 
			
		||||
                log::info!("Sending them to pay for registration now");
 | 
			
		||||
                HttpResponse::Ok()
 | 
			
		||||
                    .insert_header(("Access-Control-Expose-Headers", "*"))
 | 
			
		||||
                    .insert_header((
 | 
			
		||||
                        "HX-Redirect",
 | 
			
		||||
                        "https://secure.myvanco.com/L-Z772/campaign/C-13JPJ",
 | 
			
		||||
                    ))
 | 
			
		||||
                    .finish()
 | 
			
		||||
            }
 | 
			
		||||
            "full" => {
 | 
			
		||||
                log::info!("Sending them to pay for the full registration now");
 | 
			
		||||
                HttpResponse::Ok()
 | 
			
		||||
                    .insert_header(("Access-Control-Expose-Headers", "*"))
 | 
			
		||||
                    .insert_header((
 | 
			
		||||
                        "HX-Redirect",
 | 
			
		||||
                        "https://secure.myvanco.com/L-Z772/campaign/C-13JQE",
 | 
			
		||||
                    ))
 | 
			
		||||
                    .finish()
 | 
			
		||||
            }
 | 
			
		||||
            "later" => {
 | 
			
		||||
                log::info!("{} would like to pay later", full_name);
 | 
			
		||||
                let html = html! {
 | 
			
		||||
                    div {
 | 
			
		||||
                        class { "mt-8" }
 | 
			
		||||
                        h2 {
 | 
			
		||||
                            "Thank you, " (full_name) "!"
 | 
			
		||||
                        }
 | 
			
		||||
                        p { "Can't wait to see you at camp!" }
 | 
			
		||||
                        p {
 | 
			
		||||
                            class { "" }
 | 
			
		||||
                            "If you'd like to pay for your registration go to the donate tab in the top right when you are ready and find the camp registration option."
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    p { "Can't wait to see you at camp!" }
 | 
			
		||||
                    p {
 | 
			
		||||
                        class { "" }
 | 
			
		||||
                        "If you'd like to pay for your registration go to the donate tab in the top right when you are ready and find the camp registration option."
 | 
			
		||||
                };
 | 
			
		||||
                HttpResponse::Ok().body(html.into_string())
 | 
			
		||||
            }
 | 
			
		||||
            _ => {
 | 
			
		||||
                log::error!("Got registration error.....");
 | 
			
		||||
                let html = html! {
 | 
			
		||||
                    div {
 | 
			
		||||
                        class { "mt-8" }
 | 
			
		||||
                        h2 {
 | 
			
		||||
                            "Thank you, " (full_name) "!"
 | 
			
		||||
                        }
 | 
			
		||||
                        p { "Can't wait to see you at camp!" }
 | 
			
		||||
                        p {
 | 
			
		||||
                            class { "" }
 | 
			
		||||
                            "If you'd like to pay for your registration go to the donate tab in the top right when you are ready and find the camp registration option."
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            HttpResponse::Ok().body(html.to_string())
 | 
			
		||||
        }
 | 
			
		||||
                };
 | 
			
		||||
                HttpResponse::Ok().body(html.into_string())
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        _ => {
 | 
			
		||||
            log::error!("Got registration error.....");
 | 
			
		||||
            let html = markup::new! {
 | 
			
		||||
                div {
 | 
			
		||||
                    class { "mt-8" }
 | 
			
		||||
                    h2 {
 | 
			
		||||
                        @format!("Thank you, {}!", full_name)
 | 
			
		||||
                    }
 | 
			
		||||
                    p { "Can't wait to see you at camp!" }
 | 
			
		||||
                    p {
 | 
			
		||||
                        class { "" }
 | 
			
		||||
                        "If you'd like to pay for your registration go to the donate tab in the top right when you are ready and find the camp registration option."
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            HttpResponse::Ok().body(html.to_string())
 | 
			
		||||
            log::error!("Unknown selection for health. We don't know where to send the user.");
 | 
			
		||||
            HttpResponseBuilder::new(StatusCode::IM_A_TEAPOT)
 | 
			
		||||
                .body("Unknown selection for health. We don't know where to send the user.")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async fn store_camp_form(form: CampForm) -> Result<(), ApiError> {
 | 
			
		||||
    let request = reqwest::Client::new();
 | 
			
		||||
    let json = json::Json::from(form);
 | 
			
		||||
    let res = request
 | 
			
		||||
        .post("https://tbl.tfcconnection.org/")
 | 
			
		||||
        .header("xc-token", "Ohah24HNGXVvvixv8tvVJW5uNNdWjDJHG1d4t3o9")
 | 
			
		||||
        .body(json)
 | 
			
		||||
async fn store_camp_form(form: CampForm) -> Result<(), Error> {
 | 
			
		||||
    let request = Client::new();
 | 
			
		||||
    let mut map = HashMap::new();
 | 
			
		||||
    map.insert(
 | 
			
		||||
        63,
 | 
			
		||||
        format!(
 | 
			
		||||
            "{} {}",
 | 
			
		||||
            &form.first_name.unwrap_or(Text(String::new())).0,
 | 
			
		||||
            &form.last_name.unwrap_or(Text(String::new())).0
 | 
			
		||||
        ),
 | 
			
		||||
    );
 | 
			
		||||
    map.insert(
 | 
			
		||||
        64,
 | 
			
		||||
        format!(
 | 
			
		||||
            "{} {}",
 | 
			
		||||
            form.parent_first_name.unwrap_or(Text(String::new())).0,
 | 
			
		||||
            form.parent_last_name.unwrap_or(Text(String::new())).0
 | 
			
		||||
        ),
 | 
			
		||||
    );
 | 
			
		||||
    map.insert(65, form.parent_phone.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    map.insert(66, form.parent_email.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    map.insert(67, form.birthdate.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    map.insert(69, form.gender.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    map.insert(70, form.street.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    map.insert(71, form.city.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    map.insert(72, form.state.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    map.insert(73, form.zip.unwrap_or(Text(0)).0.to_string());
 | 
			
		||||
    map.insert(74, form.grade.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    map.insert(75, form.week.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    map.insert(76, form.shirt.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    map.insert(77, form.registration.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    map.insert(115, form.health_form.unwrap_or(Text(String::new())).0);
 | 
			
		||||
    let mut json = HashMap::new();
 | 
			
		||||
    json.insert("data", map);
 | 
			
		||||
    request
 | 
			
		||||
        .post("https://staff.tfcconnection.org/apps/tables/api/1/tables/5/rows")
 | 
			
		||||
        // .header("xc-token", "Ohah24HNGXVvvixv8tvVJW5uNNdWjDJHG1d4t3o9")
 | 
			
		||||
        .basic_auth("chris", Some("2VHeGxeC^Zf9KqFK^G@Pt!zu2q^6@b"))
 | 
			
		||||
        .json(&json)
 | 
			
		||||
        .send()
 | 
			
		||||
        .await?;
 | 
			
		||||
    Ok(())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,8 +18,3 @@ pub struct ApiError {
 | 
			
		|||
    pub cause: Option<String>,
 | 
			
		||||
    pub error_type: ApiErrorType,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize)]
 | 
			
		||||
pub struct ApiErrorResponse {
 | 
			
		||||
    pub error: String,
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										30
									
								
								src/main.rs
									
										
									
									
									
								
							
							
						
						
									
										30
									
								
								src/main.rs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -9,10 +9,38 @@ use api::local_trip_form::local_form;
 | 
			
		|||
use api::mt_form::mt_form;
 | 
			
		||||
use api::parent_form::parent_form;
 | 
			
		||||
use api::teacher_form::teacher_form;
 | 
			
		||||
use log::LevelFilter;
 | 
			
		||||
use log4rs::append::console::ConsoleAppender;
 | 
			
		||||
use log4rs::append::file::FileAppender;
 | 
			
		||||
use log4rs::config::{Appender, Root};
 | 
			
		||||
use log4rs::encode::pattern::PatternEncoder;
 | 
			
		||||
use log4rs::Config;
 | 
			
		||||
 | 
			
		||||
#[actix_web::main]
 | 
			
		||||
async fn main() -> std::io::Result<()> {
 | 
			
		||||
    env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
 | 
			
		||||
    // env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
 | 
			
		||||
    let stdout = ConsoleAppender::builder()
 | 
			
		||||
        .encoder(Box::new(PatternEncoder::new(
 | 
			
		||||
            "{d(%Y-%m-%d %H:%M:%S)} {h({l})} - {m}\n",
 | 
			
		||||
        )))
 | 
			
		||||
        .build();
 | 
			
		||||
    let logfile = FileAppender::builder()
 | 
			
		||||
        .encoder(Box::new(PatternEncoder::new(
 | 
			
		||||
            "{d(%Y-%m-%d %H:%M:%S)} {h({l})} - {m}\n",
 | 
			
		||||
        )))
 | 
			
		||||
        .build("./tmp/api.log")?;
 | 
			
		||||
 | 
			
		||||
    let config = Config::builder()
 | 
			
		||||
        .appender(Appender::builder().build("stdout", Box::new(stdout)))
 | 
			
		||||
        .appender(Appender::builder().build("logfile", Box::new(logfile)))
 | 
			
		||||
        .build(
 | 
			
		||||
            Root::builder()
 | 
			
		||||
                .appenders(vec!["logfile", "stdout"])
 | 
			
		||||
                .build(LevelFilter::Info),
 | 
			
		||||
        )
 | 
			
		||||
        .unwrap();
 | 
			
		||||
 | 
			
		||||
    let _handle = log4rs::init_config(config).expect("error setting up logger");
 | 
			
		||||
 | 
			
		||||
    log::info!("creating temporary upload directory");
 | 
			
		||||
    std::fs::create_dir_all("./tmp")?;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue