From 9e35c90f993dcd70f68a05969d3462977512c008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 00:17:51 +0100 Subject: [PATCH 01/48] =?UTF-8?q?=F0=9F=9A=80=20Create=20rust=20base=20ske?= =?UTF-8?q?leton?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tiered_pricing/base/rust/.env.example | 2 + exercises/tiered_pricing/base/rust/.gitignore | 2 + exercises/tiered_pricing/base/rust/Cargo.lock | 1189 +++++++++++++++++ exercises/tiered_pricing/base/rust/Cargo.toml | 7 + exercises/tiered_pricing/base/rust/Makefile | 23 + exercises/tiered_pricing/base/rust/README.md | 10 + .../base/rust/docker-compose.yml | 14 + .../base/rust/docker/rust/Dockerfile | 6 + .../base/rust/src/health_check.rs | 25 + .../tiered_pricing/base/rust/src/main.rs | 29 + .../tiered_pricing/base/rust/src/routes.rs | 6 + 11 files changed, 1313 insertions(+) create mode 100644 exercises/tiered_pricing/base/rust/.env.example create mode 100644 exercises/tiered_pricing/base/rust/.gitignore create mode 100644 exercises/tiered_pricing/base/rust/Cargo.lock create mode 100644 exercises/tiered_pricing/base/rust/Cargo.toml create mode 100644 exercises/tiered_pricing/base/rust/Makefile create mode 100644 exercises/tiered_pricing/base/rust/README.md create mode 100644 exercises/tiered_pricing/base/rust/docker-compose.yml create mode 100644 exercises/tiered_pricing/base/rust/docker/rust/Dockerfile create mode 100644 exercises/tiered_pricing/base/rust/src/health_check.rs create mode 100644 exercises/tiered_pricing/base/rust/src/main.rs create mode 100644 exercises/tiered_pricing/base/rust/src/routes.rs diff --git a/exercises/tiered_pricing/base/rust/.env.example b/exercises/tiered_pricing/base/rust/.env.example new file mode 100644 index 00000000..df33498a --- /dev/null +++ b/exercises/tiered_pricing/base/rust/.env.example @@ -0,0 +1,2 @@ +API_IP=0.0.0.0 +API_PORT=8000 diff --git a/exercises/tiered_pricing/base/rust/.gitignore b/exercises/tiered_pricing/base/rust/.gitignore new file mode 100644 index 00000000..fedaa2b1 --- /dev/null +++ b/exercises/tiered_pricing/base/rust/.gitignore @@ -0,0 +1,2 @@ +/target +.env diff --git a/exercises/tiered_pricing/base/rust/Cargo.lock b/exercises/tiered_pricing/base/rust/Cargo.lock new file mode 100644 index 00000000..ffff1399 --- /dev/null +++ b/exercises/tiered_pricing/base/rust/Cargo.lock @@ -0,0 +1,1189 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "actix-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "log", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util 0.7.0", +] + +[[package]] +name = "actix-http" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5885cb81a0d4d0d322864bea1bb6c2a8144626b4fdc625d4c51eba197e7797a" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "ahash", + "base64", + "bitflags", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "futures-core", + "h2", + "http", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "log", + "mime", + "percent-encoding", + "pin-project-lite", + "rand", + "sha-1", + "smallvec", + "zstd", +] + +[[package]] +name = "actix-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "actix-router" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb60846b52c118f2f04a56cc90880a274271c489b2498623d58176f8ca21fa80" +dependencies = [ + "bytestring", + "firestorm", + "http", + "log", + "regex", + "serde", +] + +[[package]] +name = "actix-rt" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ea16c295198e958ef31930a6ef37d0fb64e9ca3b6116e6b93a8bdae96ee1000" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da34f8e659ea1b077bb4637948b815cd3768ad5a188fdcd74ff4d84240cd824" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "num_cpus", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" +dependencies = [ + "futures-core", + "paste", + "pin-project-lite", +] + +[[package]] +name = "actix-utils" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e491cbaac2e7fc788dfff99ff48ef317e23b3cf63dbaf7aaab6418f40f92aa94" +dependencies = [ + "local-waker", + "pin-project-lite", +] + +[[package]] +name = "actix-web" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e5ebffd51d50df56a3ae0de0e59487340ca456f05dd0b90c0a7a6dd6a74d31" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "ahash", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more", + "encoding_rs", + "futures-core", + "futures-util", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7525bedf54704abb1d469e88d7e7e9226df73778798a69cea5022d53b2ae91bc" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "3.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f838e47a451d5a8fa552371f80024dd6ace9b7acdf25c4c3d0f9bc6816fb1c39" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "bytestring" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90706ba19e97b90786e19dc0d5e2abd80008d99d4c0c5d1ad0b5e72cec7c494d" +dependencies = [ + "bytes", +] + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "encoding_rs" +version = "0.8.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "firestorm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d3d6188b8804df28032815ea256b6955c9625c24da7525f387a7af02fbb8f01" + +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "h2" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62eeb471aa3e3c9197aa4bfeabfe02982f6dc96f750486c0bb0009ac58b26d2b" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util 0.6.9", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "http" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "jobserver" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +dependencies = [ + "libc", +] + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" + +[[package]] +name = "local-channel" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6246c68cf195087205a0512559c97e15eaf95198bf0e206d662092cdcb03fe9f" +dependencies = [ + "futures-core", + "futures-sink", + "futures-util", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "902eb695eb0591864543cbfbf6d742510642a605a61fc5e97fe6ceb5a30ac4fb" + +[[package]] +name = "lock_api" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "ntapi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" +dependencies = [ + "winapi", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_threads" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" +dependencies = [ + "libc", +] + +[[package]] +name = "once_cell" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" + +[[package]] +name = "parking_lot" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "paste" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project-lite" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4af2ec4714533fcdf07e886f17025ace8b997b9ce51204ee69b6da831c3da57" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae183fc1b06c149f0c1793e1eb447c8b04bfe46d48e9e48bfb8d2d7ed64ecf0" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "rust-base-skeleton" +version = "0.1.0" +dependencies = [ + "actix-web", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "semver" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d" + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" + +[[package]] +name = "serde_json" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +dependencies = [ + "itoa", + "ryu", + "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 = "sha-1" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "syn" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "time" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" +dependencies = [ + "itoa", + "libc", + "num_threads", + "time-macros", +] + +[[package]] +name = "time-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" + +[[package]] +name = "tinyvec" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio", + "once_cell", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "winapi", +] + +[[package]] +name = "tokio-util" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64910e1b9c1901aaf5375561e35b9c057d95ff41a44ede043a03e09279eabaf1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tracing" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "unicode-bidi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" + +[[package]] +name = "windows_i686_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" + +[[package]] +name = "windows_i686_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" + +[[package]] +name = "zstd" +version = "0.10.0+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b1365becbe415f3f0fcd024e2f7b45bacfb5bdd055f0dc113571394114e7bdd" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "4.1.4+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f7cd17c9af1a4d6c24beb1cc54b17e2ef7b593dc92f19e9d9acad8b182bbaee" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "1.6.3+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc49afa5c8d634e75761feda8c592051e7eeb4683ba827211eb0d731d3402ea8" +dependencies = [ + "cc", + "libc", +] diff --git a/exercises/tiered_pricing/base/rust/Cargo.toml b/exercises/tiered_pricing/base/rust/Cargo.toml new file mode 100644 index 00000000..b140e3be --- /dev/null +++ b/exercises/tiered_pricing/base/rust/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "rust-base-skeleton" +version = "0.1.0" +edition = "2021" + +[dependencies] +actix-web = "4" diff --git a/exercises/tiered_pricing/base/rust/Makefile b/exercises/tiered_pricing/base/rust/Makefile new file mode 100644 index 00000000..a6e08886 --- /dev/null +++ b/exercises/tiered_pricing/base/rust/Makefile @@ -0,0 +1,23 @@ +help: ## Show help + @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e "s/^[^:]*/`echo -e "\e[1m"`&`echo -e "\e[0m"`/" | sed -e "s/[^:]*##//" + +env-file: ## Copy env file example if not exist env file + @if [ ! -f .env ]; then cp .env.example .env; fi + +up: env-file ## Run rust web server + @docker-compose up -d + +build: ## Run rust web server + @docker-compose build --no-cache + +stop: ## Stop rust web server + @docker-compose stop + +down: ## Remove rust container + @docker-compose down + +run-test: env-file ## Run test on new docker container (slow) + docker-compose run --rm api cargo test + +test: ## Execute test on running docker container + docker-compose exec api cargo test diff --git a/exercises/tiered_pricing/base/rust/README.md b/exercises/tiered_pricing/base/rust/README.md new file mode 100644 index 00000000..661ca4ea --- /dev/null +++ b/exercises/tiered_pricing/base/rust/README.md @@ -0,0 +1,10 @@ +# Rust base skeleton for TDD katas + +## Run app + +`make up` default url: http://localhost:8000/health-check + +## Run tests + +- `make run-test` for run test on new container. +- `make test` for execute test on running container. diff --git a/exercises/tiered_pricing/base/rust/docker-compose.yml b/exercises/tiered_pricing/base/rust/docker-compose.yml new file mode 100644 index 00000000..74bad491 --- /dev/null +++ b/exercises/tiered_pricing/base/rust/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3' +services: + api: + container_name: rust-api + build: + context: docker/rust + dockerfile: Dockerfile + ports: + - ${API_PORT}:${API_PORT} + env_file: + - .env + volumes: + - ./:/app/ + command: "cargo watch -x 'run -- --bin api'" diff --git a/exercises/tiered_pricing/base/rust/docker/rust/Dockerfile b/exercises/tiered_pricing/base/rust/docker/rust/Dockerfile new file mode 100644 index 00000000..67144beb --- /dev/null +++ b/exercises/tiered_pricing/base/rust/docker/rust/Dockerfile @@ -0,0 +1,6 @@ +FROM rust:1-alpine + +WORKDIR /app + +RUN apk update && apk add --no-cache musl-dev openssl-dev +RUN cargo install cargo-watch diff --git a/exercises/tiered_pricing/base/rust/src/health_check.rs b/exercises/tiered_pricing/base/rust/src/health_check.rs new file mode 100644 index 00000000..e098e2db --- /dev/null +++ b/exercises/tiered_pricing/base/rust/src/health_check.rs @@ -0,0 +1,25 @@ +use actix_web::{HttpResponse, Responder}; + +pub async fn health_check() -> impl Responder { + HttpResponse::Ok() +} + +#[cfg(test)] +mod tests { + use super::*; + use actix_web::{App, test, web}; + + #[actix_web::test] + async fn health_check_return_ok() { + let app = test::init_service( + App::new().route("/health-check", web::get().to(health_check)) + ).await; + + let request = test::TestRequest::get().uri("/health-check").to_request(); + + let response = test::call_service(&app, request).await; + + println!("{:?}", response.status()); + assert!(response.status().is_success()); + } +} diff --git a/exercises/tiered_pricing/base/rust/src/main.rs b/exercises/tiered_pricing/base/rust/src/main.rs new file mode 100644 index 00000000..034b52a0 --- /dev/null +++ b/exercises/tiered_pricing/base/rust/src/main.rs @@ -0,0 +1,29 @@ +mod routes; +mod health_check; + +use actix_web::{App, HttpServer}; +use routes::routes; + +const API_IP: &str = env!("API_IP"); +const API_PORT: &str = env!("API_PORT"); + +fn get_address() -> String { + format!("{}:{}", API_IP, API_PORT) +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + let server = HttpServer::new( || { + App::new() + .configure(routes) + }) + .bind(get_address()); + + match server { + Ok(server) => { + println!("🚀 Server running at {}", get_address()); + server.run().await + } + Err(_) => panic!("🔥 Coul not start the server at {}", get_address()) + } +} diff --git a/exercises/tiered_pricing/base/rust/src/routes.rs b/exercises/tiered_pricing/base/rust/src/routes.rs new file mode 100644 index 00000000..ae5a8369 --- /dev/null +++ b/exercises/tiered_pricing/base/rust/src/routes.rs @@ -0,0 +1,6 @@ +use actix_web::web; +use crate::health_check::health_check; + +pub fn routes(cfg: &mut web::ServiceConfig) { + cfg.route("/health-check", web::get().to(health_check)); +} From 10dde03b869aff0d7bbc67be3155a8906f91a8cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 00:20:31 +0100 Subject: [PATCH 02/48] Initial commit --- exercises/tiered_pricing/solutions/.gitkeep | 0 .../isaac1024_baby-steps/.env.example | 2 + .../solutions/isaac1024_baby-steps/.gitignore | 2 + .../solutions/isaac1024_baby-steps/Cargo.lock | 1189 +++++++++++++++++ .../solutions/isaac1024_baby-steps/Cargo.toml | 7 + .../solutions/isaac1024_baby-steps/Makefile | 23 + .../solutions/isaac1024_baby-steps/README.md | 10 + .../isaac1024_baby-steps/docker-compose.yml | 14 + .../docker/rust/Dockerfile | 6 + .../isaac1024_baby-steps/src/health_check.rs | 25 + .../isaac1024_baby-steps/src/main.rs | 29 + .../isaac1024_baby-steps/src/routes.rs | 6 + 12 files changed, 1313 insertions(+) delete mode 100644 exercises/tiered_pricing/solutions/.gitkeep create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/.env.example create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/.gitignore create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/Makefile create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/README.md create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/docker-compose.yml create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/docker/rust/Dockerfile create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/health_check.rs create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs diff --git a/exercises/tiered_pricing/solutions/.gitkeep b/exercises/tiered_pricing/solutions/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/.env.example b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/.env.example new file mode 100644 index 00000000..df33498a --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/.env.example @@ -0,0 +1,2 @@ +API_IP=0.0.0.0 +API_PORT=8000 diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/.gitignore b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/.gitignore new file mode 100644 index 00000000..fedaa2b1 --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/.gitignore @@ -0,0 +1,2 @@ +/target +.env diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock new file mode 100644 index 00000000..ffff1399 --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock @@ -0,0 +1,1189 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "actix-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "log", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util 0.7.0", +] + +[[package]] +name = "actix-http" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5885cb81a0d4d0d322864bea1bb6c2a8144626b4fdc625d4c51eba197e7797a" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "ahash", + "base64", + "bitflags", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "futures-core", + "h2", + "http", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "log", + "mime", + "percent-encoding", + "pin-project-lite", + "rand", + "sha-1", + "smallvec", + "zstd", +] + +[[package]] +name = "actix-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "actix-router" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb60846b52c118f2f04a56cc90880a274271c489b2498623d58176f8ca21fa80" +dependencies = [ + "bytestring", + "firestorm", + "http", + "log", + "regex", + "serde", +] + +[[package]] +name = "actix-rt" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ea16c295198e958ef31930a6ef37d0fb64e9ca3b6116e6b93a8bdae96ee1000" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da34f8e659ea1b077bb4637948b815cd3768ad5a188fdcd74ff4d84240cd824" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "num_cpus", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" +dependencies = [ + "futures-core", + "paste", + "pin-project-lite", +] + +[[package]] +name = "actix-utils" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e491cbaac2e7fc788dfff99ff48ef317e23b3cf63dbaf7aaab6418f40f92aa94" +dependencies = [ + "local-waker", + "pin-project-lite", +] + +[[package]] +name = "actix-web" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e5ebffd51d50df56a3ae0de0e59487340ca456f05dd0b90c0a7a6dd6a74d31" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "ahash", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more", + "encoding_rs", + "futures-core", + "futures-util", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7525bedf54704abb1d469e88d7e7e9226df73778798a69cea5022d53b2ae91bc" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "3.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f838e47a451d5a8fa552371f80024dd6ace9b7acdf25c4c3d0f9bc6816fb1c39" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "bytestring" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90706ba19e97b90786e19dc0d5e2abd80008d99d4c0c5d1ad0b5e72cec7c494d" +dependencies = [ + "bytes", +] + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "encoding_rs" +version = "0.8.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "firestorm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d3d6188b8804df28032815ea256b6955c9625c24da7525f387a7af02fbb8f01" + +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "h2" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62eeb471aa3e3c9197aa4bfeabfe02982f6dc96f750486c0bb0009ac58b26d2b" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util 0.6.9", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "http" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "jobserver" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +dependencies = [ + "libc", +] + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" + +[[package]] +name = "local-channel" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6246c68cf195087205a0512559c97e15eaf95198bf0e206d662092cdcb03fe9f" +dependencies = [ + "futures-core", + "futures-sink", + "futures-util", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "902eb695eb0591864543cbfbf6d742510642a605a61fc5e97fe6ceb5a30ac4fb" + +[[package]] +name = "lock_api" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "ntapi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" +dependencies = [ + "winapi", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_threads" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" +dependencies = [ + "libc", +] + +[[package]] +name = "once_cell" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" + +[[package]] +name = "parking_lot" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "paste" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project-lite" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4af2ec4714533fcdf07e886f17025ace8b997b9ce51204ee69b6da831c3da57" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae183fc1b06c149f0c1793e1eb447c8b04bfe46d48e9e48bfb8d2d7ed64ecf0" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "rust-base-skeleton" +version = "0.1.0" +dependencies = [ + "actix-web", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "semver" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d" + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" + +[[package]] +name = "serde_json" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +dependencies = [ + "itoa", + "ryu", + "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 = "sha-1" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "syn" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "time" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" +dependencies = [ + "itoa", + "libc", + "num_threads", + "time-macros", +] + +[[package]] +name = "time-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" + +[[package]] +name = "tinyvec" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio", + "once_cell", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "winapi", +] + +[[package]] +name = "tokio-util" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64910e1b9c1901aaf5375561e35b9c057d95ff41a44ede043a03e09279eabaf1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tracing" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "unicode-bidi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" + +[[package]] +name = "windows_i686_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" + +[[package]] +name = "windows_i686_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" + +[[package]] +name = "zstd" +version = "0.10.0+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b1365becbe415f3f0fcd024e2f7b45bacfb5bdd055f0dc113571394114e7bdd" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "4.1.4+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f7cd17c9af1a4d6c24beb1cc54b17e2ef7b593dc92f19e9d9acad8b182bbaee" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "1.6.3+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc49afa5c8d634e75761feda8c592051e7eeb4683ba827211eb0d731d3402ea8" +dependencies = [ + "cc", + "libc", +] diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml new file mode 100644 index 00000000..b140e3be --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "rust-base-skeleton" +version = "0.1.0" +edition = "2021" + +[dependencies] +actix-web = "4" diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Makefile b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Makefile new file mode 100644 index 00000000..a6e08886 --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Makefile @@ -0,0 +1,23 @@ +help: ## Show help + @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e "s/^[^:]*/`echo -e "\e[1m"`&`echo -e "\e[0m"`/" | sed -e "s/[^:]*##//" + +env-file: ## Copy env file example if not exist env file + @if [ ! -f .env ]; then cp .env.example .env; fi + +up: env-file ## Run rust web server + @docker-compose up -d + +build: ## Run rust web server + @docker-compose build --no-cache + +stop: ## Stop rust web server + @docker-compose stop + +down: ## Remove rust container + @docker-compose down + +run-test: env-file ## Run test on new docker container (slow) + docker-compose run --rm api cargo test + +test: ## Execute test on running docker container + docker-compose exec api cargo test diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/README.md b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/README.md new file mode 100644 index 00000000..661ca4ea --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/README.md @@ -0,0 +1,10 @@ +# Rust base skeleton for TDD katas + +## Run app + +`make up` default url: http://localhost:8000/health-check + +## Run tests + +- `make run-test` for run test on new container. +- `make test` for execute test on running container. diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/docker-compose.yml b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/docker-compose.yml new file mode 100644 index 00000000..74bad491 --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3' +services: + api: + container_name: rust-api + build: + context: docker/rust + dockerfile: Dockerfile + ports: + - ${API_PORT}:${API_PORT} + env_file: + - .env + volumes: + - ./:/app/ + command: "cargo watch -x 'run -- --bin api'" diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/docker/rust/Dockerfile b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/docker/rust/Dockerfile new file mode 100644 index 00000000..67144beb --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/docker/rust/Dockerfile @@ -0,0 +1,6 @@ +FROM rust:1-alpine + +WORKDIR /app + +RUN apk update && apk add --no-cache musl-dev openssl-dev +RUN cargo install cargo-watch diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/health_check.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/health_check.rs new file mode 100644 index 00000000..e098e2db --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/health_check.rs @@ -0,0 +1,25 @@ +use actix_web::{HttpResponse, Responder}; + +pub async fn health_check() -> impl Responder { + HttpResponse::Ok() +} + +#[cfg(test)] +mod tests { + use super::*; + use actix_web::{App, test, web}; + + #[actix_web::test] + async fn health_check_return_ok() { + let app = test::init_service( + App::new().route("/health-check", web::get().to(health_check)) + ).await; + + let request = test::TestRequest::get().uri("/health-check").to_request(); + + let response = test::call_service(&app, request).await; + + println!("{:?}", response.status()); + assert!(response.status().is_success()); + } +} diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs new file mode 100644 index 00000000..034b52a0 --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs @@ -0,0 +1,29 @@ +mod routes; +mod health_check; + +use actix_web::{App, HttpServer}; +use routes::routes; + +const API_IP: &str = env!("API_IP"); +const API_PORT: &str = env!("API_PORT"); + +fn get_address() -> String { + format!("{}:{}", API_IP, API_PORT) +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + let server = HttpServer::new( || { + App::new() + .configure(routes) + }) + .bind(get_address()); + + match server { + Ok(server) => { + println!("🚀 Server running at {}", get_address()); + server.run().await + } + Err(_) => panic!("🔥 Coul not start the server at {}", get_address()) + } +} diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs new file mode 100644 index 00000000..ae5a8369 --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs @@ -0,0 +1,6 @@ +use actix_web::web; +use crate::health_check::health_check; + +pub fn routes(cfg: &mut web::ServiceConfig) { + cfg.route("/health-check", web::get().to(health_check)); +} From 024e396eed0a6e983f17d0b1aab820e540cab418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 00:35:11 +0100 Subject: [PATCH 03/48] =?UTF-8?q?=F0=9F=94=B4=20Create=20test=20for=201=20?= =?UTF-8?q?subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/main.rs | 1 + .../isaac1024_baby-steps/src/tiered_pricing.rs | 13 +++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs index 034b52a0..660e00aa 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs @@ -1,5 +1,6 @@ mod routes; mod health_check; +mod tiered_pricing; use actix_web::{App, HttpServer}; use routes::routes; diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs new file mode 100644 index 00000000..e3c2ac0a --- /dev/null +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -0,0 +1,13 @@ +fn get_total_subscription_price(number: u32) -> u32 { + 0 +} + +#[cfg(test)] +mod tests { + use crate::tiered_pricing::get_total_subscription_price; + + #[test] + fn when_get_a_subscription_return_299_euros() { + assert_eq!(299, get_total_subscription_price(1)); + } +} From fe81c39e0a48c13bbbf952d17a86c5ec15fc152a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 00:44:13 +0100 Subject: [PATCH 04/48] =?UTF-8?q?=F0=9F=9F=A2=20Return=20299=20when=20rece?= =?UTF-8?q?ibe=201=20subscription?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index e3c2ac0a..a2b99f8e 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,5 +1,5 @@ fn get_total_subscription_price(number: u32) -> u32 { - 0 + 299 } #[cfg(test)] From 23a6ba121192ca46e42bb311d596da8d3e1e289f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 21:29:25 +0100 Subject: [PATCH 05/48] =?UTF-8?q?=F0=9F=94=B5=20Magic=20number=20to=20cons?= =?UTF-8?q?tant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index a2b99f8e..635fdc34 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,5 +1,7 @@ fn get_total_subscription_price(number: u32) -> u32 { - 299 + const UNIT_PRICE: u32 = 299; + + UNIT_PRICE } #[cfg(test)] From fd4faef91e5c93d11c25769897c902c15d031268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 21:30:34 +0100 Subject: [PATCH 06/48] =?UTF-8?q?=F0=9F=94=B5=20Better=20parameter=20namin?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 635fdc34..dfad2d29 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,4 +1,4 @@ -fn get_total_subscription_price(number: u32) -> u32 { +fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const UNIT_PRICE: u32 = 299; UNIT_PRICE From fb15739fd035cfd20c8fe4107c6019e30fe6204e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 21:35:15 +0100 Subject: [PATCH 07/48] =?UTF-8?q?=F0=9F=94=B4=20Create=20test=20for=202=20?= =?UTF-8?q?subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index dfad2d29..a2eb47e4 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -12,4 +12,9 @@ mod tests { fn when_get_a_subscription_return_299_euros() { assert_eq!(299, get_total_subscription_price(1)); } + + #[test] + fn when_get_2_subscriptions_return_598_euros() { + assert_eq!(598, get_total_subscription_price(2)); + } } From e80cdfffe8deb95252e400cc1abd00706f658a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 21:44:46 +0100 Subject: [PATCH 08/48] =?UTF-8?q?=F0=9F=9F=A2=20Implement=202=20subscripti?= =?UTF-8?q?ons=20price?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index a2eb47e4..b2da6b64 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,7 +1,10 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const UNIT_PRICE: u32 = 299; - UNIT_PRICE + match number_of_subscriptions { + 1 => UNIT_PRICE, + _ => 598 + } } #[cfg(test)] From 982d50afb1ea1495ebe9eb3d91a62a54916964b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 21:52:09 +0100 Subject: [PATCH 09/48] =?UTF-8?q?=F0=9F=94=B5=20Transform=20match=20to=20a?= =?UTF-8?q?lgorithm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index b2da6b64..ab47d8b5 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,10 +1,7 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const UNIT_PRICE: u32 = 299; - match number_of_subscriptions { - 1 => UNIT_PRICE, - _ => 598 - } + UNIT_PRICE * number_of_subscriptions } #[cfg(test)] From cc0a25bdac971557c68665880b1c27062f5cf4e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 21:54:04 +0100 Subject: [PATCH 10/48] =?UTF-8?q?=F0=9F=94=B4=20Add=20test=20for=203=20sub?= =?UTF-8?q?scriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index ab47d8b5..96d05c5f 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -17,4 +17,9 @@ mod tests { fn when_get_2_subscriptions_return_598_euros() { assert_eq!(598, get_total_subscription_price(2)); } + + #[test] + fn when_get_3_subscriptions_return_717_euros() { + assert_eq!(717, get_total_subscription_price(3)); + } } From c0dd771282acbb2b724d0f378830ebeb517e89da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 21:56:39 +0100 Subject: [PATCH 11/48] =?UTF-8?q?=F0=9F=9F=A2=20Implement=20resolution=20f?= =?UTF-8?q?or=203=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 96d05c5f..fce5faea 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,7 +1,10 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const UNIT_PRICE: u32 = 299; - UNIT_PRICE * number_of_subscriptions + match number_of_subscriptions { + 3 => 717, + _ => UNIT_PRICE * number_of_subscriptions + } } #[cfg(test)] From 918885b1f7699539882c058bfcd3d1e517735232 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 21:58:43 +0100 Subject: [PATCH 12/48] =?UTF-8?q?=F0=9F=94=B4=20Add=20test=20for=2010=20su?= =?UTF-8?q?bscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index fce5faea..9b511663 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -25,4 +25,9 @@ mod tests { fn when_get_3_subscriptions_return_717_euros() { assert_eq!(717, get_total_subscription_price(3)); } + + #[test] + fn when_get_10_subscriptions_return_2390_euros() { + assert_eq!(2390, get_total_subscription_price(10)); + } } From 7a5d99c2ba6b7bc422924e0ca667c2b790b2d7ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:00:11 +0100 Subject: [PATCH 13/48] =?UTF-8?q?=F0=9F=9F=A2=20Add=20implementation=20for?= =?UTF-8?q?=2010=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 9b511663..f9f64660 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -3,6 +3,7 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { match number_of_subscriptions { 3 => 717, + 10 => 2390, _ => UNIT_PRICE * number_of_subscriptions } } From 3c4cc0a71ea254be5afe9bf3ccbb3ca42d11058a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:05:00 +0100 Subject: [PATCH 14/48] =?UTF-8?q?=F0=9F=94=B5=20Extract=20the=20greatest?= =?UTF-8?q?=20common=20divisor=20for=203=20and=2010=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index f9f64660..ef87db2b 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -2,8 +2,8 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const UNIT_PRICE: u32 = 299; match number_of_subscriptions { - 3 => 717, - 10 => 2390, + 3 => number_of_subscriptions * 239, + 10 => number_of_subscriptions * 239, _ => UNIT_PRICE * number_of_subscriptions } } From 7d2151e8f0bf4fe2f14dabb791f5aeb8f573199c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:07:51 +0100 Subject: [PATCH 15/48] =?UTF-8?q?=F0=9F=94=B5=20Extract=20magic=20number?= =?UTF-8?q?=20to=20constant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index ef87db2b..946101c6 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,9 +1,10 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const UNIT_PRICE: u32 = 299; + const SECOND_UNIT_PRICE: u32 = 239; match number_of_subscriptions { - 3 => number_of_subscriptions * 239, - 10 => number_of_subscriptions * 239, + 3 => number_of_subscriptions * SECOND_UNIT_PRICE, + 10 => number_of_subscriptions * SECOND_UNIT_PRICE, _ => UNIT_PRICE * number_of_subscriptions } } From 7af1b22c017fabd43036e27e1b0a358837200d18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:10:17 +0100 Subject: [PATCH 16/48] =?UTF-8?q?=F0=9F=94=B5=20Rename=20constant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 946101c6..fe0728c1 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,5 +1,5 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { - const UNIT_PRICE: u32 = 299; + const FIRST_UNIT_PRICE: u32 = 299; const SECOND_UNIT_PRICE: u32 = 239; match number_of_subscriptions { From af3e113cba6514de6a92df71d7b6940e00754a12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:21:11 +0100 Subject: [PATCH 17/48] =?UTF-8?q?=F0=9F=94=B5=20Refactor=20subscription=20?= =?UTF-8?q?algorithm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index fe0728c1..4edc957f 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -3,9 +3,8 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const SECOND_UNIT_PRICE: u32 = 239; match number_of_subscriptions { - 3 => number_of_subscriptions * SECOND_UNIT_PRICE, - 10 => number_of_subscriptions * SECOND_UNIT_PRICE, - _ => UNIT_PRICE * number_of_subscriptions + 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, + _ => SECOND_UNIT_PRICE * number_of_subscriptions } } From 061a59fdf3f55c3d60b7329192372d61134636ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:23:10 +0100 Subject: [PATCH 18/48] =?UTF-8?q?=F0=9F=94=B4=20Add=20test=20for=2011=20su?= =?UTF-8?q?bscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 4edc957f..25f56c38 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -31,4 +31,9 @@ mod tests { fn when_get_10_subscriptions_return_2390_euros() { assert_eq!(2390, get_total_subscription_price(10)); } + + #[test] + fn when_get_11_subscriptions_return_2409_euros() { + assert_eq!(2409, get_total_subscription_price(11)); + } } From ed16fa44b277bc6d1c9ee097256e22a285525f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:23:53 +0100 Subject: [PATCH 19/48] =?UTF-8?q?=F0=9F=9F=A2=20Add=20implementation=20for?= =?UTF-8?q?=2011=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 25f56c38..3caa5b95 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -3,6 +3,7 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const SECOND_UNIT_PRICE: u32 = 239; match number_of_subscriptions { + 11 => 2409, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, _ => SECOND_UNIT_PRICE * number_of_subscriptions } From a1d0609383cd1cf00110a8083241489e376ffa99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:25:34 +0100 Subject: [PATCH 20/48] =?UTF-8?q?=F0=9F=94=B4=20Add=20test=20for=2025=20su?= =?UTF-8?q?bscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 3caa5b95..e38f2d3a 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -37,4 +37,9 @@ mod tests { fn when_get_11_subscriptions_return_2409_euros() { assert_eq!(2409, get_total_subscription_price(11)); } + + #[test] + fn when_get_25_subscriptions_return_5475_euros() { + assert_eq!(5475, get_total_subscription_price(25)); + } } From 4c8fd2066df111e4a23180b3a0d86ed0ac1928e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:26:02 +0100 Subject: [PATCH 21/48] =?UTF-8?q?=F0=9F=9F=A2=20Add=20implementation=20for?= =?UTF-8?q?=2025=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index e38f2d3a..68c8141a 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -4,6 +4,7 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { match number_of_subscriptions { 11 => 2409, + 25 => 5475, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, _ => SECOND_UNIT_PRICE * number_of_subscriptions } From 3b9785da4e84668b3e414ae7743db9744cbf70b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:27:55 +0100 Subject: [PATCH 22/48] =?UTF-8?q?=F0=9F=94=B5=20Extract=20the=20greatest?= =?UTF-8?q?=20common=20division=20for=2011=20and=2025=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 68c8141a..2c99aec2 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -3,8 +3,8 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const SECOND_UNIT_PRICE: u32 = 239; match number_of_subscriptions { - 11 => 2409, - 25 => 5475, + 11 => 219 * number_of_subscriptions, + 25 => 219 * number_of_subscriptions, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, _ => SECOND_UNIT_PRICE * number_of_subscriptions } From b0addd0fdee9fd358c9383a1beffa6adcbbe3a02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:29:31 +0100 Subject: [PATCH 23/48] =?UTF-8?q?=F0=9F=94=B5=20Extract=20magic=20number?= =?UTF-8?q?=20to=20constant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 2c99aec2..ce9bd3a7 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,10 +1,11 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const FIRST_UNIT_PRICE: u32 = 299; const SECOND_UNIT_PRICE: u32 = 239; + const THIRD_UNIT_PRICE: u32 = 219; match number_of_subscriptions { - 11 => 219 * number_of_subscriptions, - 25 => 219 * number_of_subscriptions, + 11 => THIRD_UNIT_PRICE * number_of_subscriptions, + 25 => THIRD_UNIT_PRICE * number_of_subscriptions, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, _ => SECOND_UNIT_PRICE * number_of_subscriptions } From aa24e658c681c7bfef8729ae79ac1c8a7b1a4f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:31:22 +0100 Subject: [PATCH 24/48] =?UTF-8?q?=F0=9F=94=B5=20Refactor=20subscription=20?= =?UTF-8?q?algorithm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index ce9bd3a7..0406799f 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -4,10 +4,9 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const THIRD_UNIT_PRICE: u32 = 219; match number_of_subscriptions { - 11 => THIRD_UNIT_PRICE * number_of_subscriptions, - 25 => THIRD_UNIT_PRICE * number_of_subscriptions, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, - _ => SECOND_UNIT_PRICE * number_of_subscriptions + 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, + _ => THIRD_UNIT_PRICE * number_of_subscriptions, } } From 837a90febb46a8756d8f8e7895605b5cadbea3d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:33:20 +0100 Subject: [PATCH 25/48] =?UTF-8?q?=F0=9F=94=B4=20Add=20test=20for=2026=20su?= =?UTF-8?q?bscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 0406799f..a33fb5cf 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -43,4 +43,9 @@ mod tests { fn when_get_25_subscriptions_return_5475_euros() { assert_eq!(5475, get_total_subscription_price(25)); } + + #[test] + fn when_get_26_subscriptions_return_5174_euros() { + assert_eq!(5174, get_total_subscription_price(26)); + } } From 1093bc09f6f1f7130e006cfbb3fba0e3ac2661cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:34:44 +0100 Subject: [PATCH 26/48] =?UTF-8?q?=F0=9F=9F=A2=20Add=20implementation=20for?= =?UTF-8?q?=2026=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index a33fb5cf..ac750ced 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -4,6 +4,7 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const THIRD_UNIT_PRICE: u32 = 219; match number_of_subscriptions { + 26 => 5174, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, _ => THIRD_UNIT_PRICE * number_of_subscriptions, From a241e669d0b6e5db9269eef83ffde7856d34d840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:36:28 +0100 Subject: [PATCH 27/48] =?UTF-8?q?=F0=9F=94=B4=20Add=20test=20for=2050=20su?= =?UTF-8?q?bscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index ac750ced..7a1bdb53 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -49,4 +49,9 @@ mod tests { fn when_get_26_subscriptions_return_5174_euros() { assert_eq!(5174, get_total_subscription_price(26)); } + + #[test] + fn when_get_50_subscriptions_return_9950_euros() { + assert_eq!(9950, get_total_subscription_price(50)); + } } From e29c0d1f84c2e9d42c7821ac4c922fac2a4b00f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:36:46 +0100 Subject: [PATCH 28/48] =?UTF-8?q?=F0=9F=9F=A2=20Add=20implementation=20for?= =?UTF-8?q?=2050=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 7a1bdb53..de0d5688 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -5,6 +5,7 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { match number_of_subscriptions { 26 => 5174, + 50 => 9950, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, _ => THIRD_UNIT_PRICE * number_of_subscriptions, From faa43bd55a131bd8f44cc945cfe028687d4aa88d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:39:03 +0100 Subject: [PATCH 29/48] =?UTF-8?q?=F0=9F=94=B5=20Extract=20the=20greatest?= =?UTF-8?q?=20common=20division=20for=2026=20and=2050=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index de0d5688..010dec05 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -4,8 +4,8 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const THIRD_UNIT_PRICE: u32 = 219; match number_of_subscriptions { - 26 => 5174, - 50 => 9950, + 26 => 199 * number_of_subscriptions, + 50 => 199 * number_of_subscriptions, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, _ => THIRD_UNIT_PRICE * number_of_subscriptions, From 69220f8925821eff20061cf9f92e7659f8489e1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:41:29 +0100 Subject: [PATCH 30/48] =?UTF-8?q?=F0=9F=94=B5=20Extract=20magic=20number?= =?UTF-8?q?=20to=20constant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 010dec05..36659d2f 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -2,10 +2,11 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const FIRST_UNIT_PRICE: u32 = 299; const SECOND_UNIT_PRICE: u32 = 239; const THIRD_UNIT_PRICE: u32 = 219; + const FOURTH_UNIT_PRICE: u32 = 199; match number_of_subscriptions { - 26 => 199 * number_of_subscriptions, - 50 => 199 * number_of_subscriptions, + 26 => FOURTH_UNIT_PRICE * number_of_subscriptions, + 50 => FOURTH_UNIT_PRICE * number_of_subscriptions, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, _ => THIRD_UNIT_PRICE * number_of_subscriptions, From c08e48f8997a06ce8660588fd0456b2597df0e02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:43:39 +0100 Subject: [PATCH 31/48] =?UTF-8?q?=F0=9F=94=B5=20Refactor=20subscription=20?= =?UTF-8?q?algorithm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 36659d2f..ddd0848a 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -5,11 +5,10 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const FOURTH_UNIT_PRICE: u32 = 199; match number_of_subscriptions { - 26 => FOURTH_UNIT_PRICE * number_of_subscriptions, - 50 => FOURTH_UNIT_PRICE * number_of_subscriptions, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, - _ => THIRD_UNIT_PRICE * number_of_subscriptions, + 11..=25 => THIRD_UNIT_PRICE * number_of_subscriptions, + _ => FOURTH_UNIT_PRICE * number_of_subscriptions, } } From f293820a804c30fc1d866ee9063cea0e3f5a5680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:45:08 +0100 Subject: [PATCH 32/48] =?UTF-8?q?=F0=9F=94=B4=20Add=20test=20for=2051=20su?= =?UTF-8?q?bscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index ddd0848a..c563f029 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -55,4 +55,9 @@ mod tests { fn when_get_50_subscriptions_return_9950_euros() { assert_eq!(9950, get_total_subscription_price(50)); } + + #[test] + fn when_get_51_subscriptions_return_7599_euros() { + assert_eq!(7599, get_total_subscription_price(51)); + } } From 4380ee6d4ded4de970685e639638b9840aca0192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:46:30 +0100 Subject: [PATCH 33/48] =?UTF-8?q?=F0=9F=9F=A2=20Add=20implementation=20for?= =?UTF-8?q?=2051=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index c563f029..da9fb569 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -5,6 +5,7 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const FOURTH_UNIT_PRICE: u32 = 199; match number_of_subscriptions { + 51 => 7599, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, 11..=25 => THIRD_UNIT_PRICE * number_of_subscriptions, From b121b595f3b6d9e45471076a9f99527f7accc0a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:48:41 +0100 Subject: [PATCH 34/48] =?UTF-8?q?=F0=9F=94=B4=20Add=20test=20for=2052=20su?= =?UTF-8?q?bscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index da9fb569..cf779654 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -61,4 +61,9 @@ mod tests { fn when_get_51_subscriptions_return_7599_euros() { assert_eq!(7599, get_total_subscription_price(51)); } + + #[test] + fn when_get_52_subscriptions_return_7748_euros() { + assert_eq!(7748, get_total_subscription_price(52)); + } } From 35eb1c78cca8a157bb061606035c82d90f1468de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:49:14 +0100 Subject: [PATCH 35/48] =?UTF-8?q?=F0=9F=9F=A2=20Add=20implementation=20for?= =?UTF-8?q?=2052=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index cf779654..abe24607 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -6,6 +6,7 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { match number_of_subscriptions { 51 => 7599, + 52 => 7748, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, 11..=25 => THIRD_UNIT_PRICE * number_of_subscriptions, From 920d49d89ac1eca993ac5f6a7bc79e6fa5699b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:50:19 +0100 Subject: [PATCH 36/48] =?UTF-8?q?=F0=9F=94=B5=20Extract=20the=20greatest?= =?UTF-8?q?=20common=20division=20for=2051=20and=2052=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index abe24607..236a4d5f 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -5,8 +5,8 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const FOURTH_UNIT_PRICE: u32 = 199; match number_of_subscriptions { - 51 => 7599, - 52 => 7748, + 51 => 149 * number_of_subscriptions, + 52 => 149 * number_of_subscriptions, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, 11..=25 => THIRD_UNIT_PRICE * number_of_subscriptions, From edede151e58a8f325080710588fee0e167ba7854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:52:24 +0100 Subject: [PATCH 37/48] =?UTF-8?q?=F0=9F=94=B5=20Extract=20magic=20number?= =?UTF-8?q?=20to=20constant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 236a4d5f..caaef6bf 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -3,10 +3,11 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const SECOND_UNIT_PRICE: u32 = 239; const THIRD_UNIT_PRICE: u32 = 219; const FOURTH_UNIT_PRICE: u32 = 199; + const FIFTH_UNIT_PRICE: u32 = 149; match number_of_subscriptions { - 51 => 149 * number_of_subscriptions, - 52 => 149 * number_of_subscriptions, + 51 => FIFTH_UNIT_PRICE * number_of_subscriptions, + 52 => FIFTH_UNIT_PRICE * number_of_subscriptions, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, 11..=25 => THIRD_UNIT_PRICE * number_of_subscriptions, From b4354eefbb26282627f1191e5f04472fe330abbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 22:53:24 +0100 Subject: [PATCH 38/48] =?UTF-8?q?=F0=9F=94=B5=20Refactor=20subscription=20?= =?UTF-8?q?algorithm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index caaef6bf..e728fff5 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -6,12 +6,11 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const FIFTH_UNIT_PRICE: u32 = 149; match number_of_subscriptions { - 51 => FIFTH_UNIT_PRICE * number_of_subscriptions, - 52 => FIFTH_UNIT_PRICE * number_of_subscriptions, 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, 11..=25 => THIRD_UNIT_PRICE * number_of_subscriptions, - _ => FOURTH_UNIT_PRICE * number_of_subscriptions, + 26..=50 => FOURTH_UNIT_PRICE * number_of_subscriptions, + _ => FIFTH_UNIT_PRICE * number_of_subscriptions, } } From 807ee95dea186208ed8c048760b1fbf8ed8064be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 23:13:17 +0100 Subject: [PATCH 39/48] =?UTF-8?q?=F0=9F=94=B4=20Add=20test=20for=200=20sub?= =?UTF-8?q?scriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/tiered_pricing.rs | 67 ++++++++++++------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index e728fff5..ce44ecd4 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,4 +1,4 @@ -fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { +fn get_total_subscription_price(number_of_subscriptions: u32) -> Result { const FIRST_UNIT_PRICE: u32 = 299; const SECOND_UNIT_PRICE: u32 = 239; const THIRD_UNIT_PRICE: u32 = 219; @@ -6,11 +6,11 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> u32 { const FIFTH_UNIT_PRICE: u32 = 149; match number_of_subscriptions { - 1|2 => FIRST_UNIT_PRICE * number_of_subscriptions, - 3..=10 => SECOND_UNIT_PRICE * number_of_subscriptions, - 11..=25 => THIRD_UNIT_PRICE * number_of_subscriptions, - 26..=50 => FOURTH_UNIT_PRICE * number_of_subscriptions, - _ => FIFTH_UNIT_PRICE * number_of_subscriptions, + 1|2 => Ok(FIRST_UNIT_PRICE * number_of_subscriptions), + 3..=10 => Ok(SECOND_UNIT_PRICE * number_of_subscriptions), + 11..=25 => Ok(THIRD_UNIT_PRICE * number_of_subscriptions), + 26..=50 => Ok(FOURTH_UNIT_PRICE * number_of_subscriptions), + _ => Ok(FIFTH_UNIT_PRICE * number_of_subscriptions), } } @@ -19,52 +19,67 @@ mod tests { use crate::tiered_pricing::get_total_subscription_price; #[test] - fn when_get_a_subscription_return_299_euros() { - assert_eq!(299, get_total_subscription_price(1)); + fn when_get_a_subscription_return_299_euros() -> Result<(), String> { + assert_eq!(299, get_total_subscription_price(1)?); + Ok(()) } #[test] - fn when_get_2_subscriptions_return_598_euros() { - assert_eq!(598, get_total_subscription_price(2)); + fn when_get_2_subscriptions_return_598_euros() -> Result<(), String> { + assert_eq!(598, get_total_subscription_price(2)?); + Ok(()) } #[test] - fn when_get_3_subscriptions_return_717_euros() { - assert_eq!(717, get_total_subscription_price(3)); + fn when_get_3_subscriptions_return_717_euros() -> Result<(), String> { + assert_eq!(717, get_total_subscription_price(3)?); + Ok(()) } #[test] - fn when_get_10_subscriptions_return_2390_euros() { - assert_eq!(2390, get_total_subscription_price(10)); + fn when_get_10_subscriptions_return_2390_euros() -> Result<(), String> { + assert_eq!(2390, get_total_subscription_price(10)?); + Ok(()) } #[test] - fn when_get_11_subscriptions_return_2409_euros() { - assert_eq!(2409, get_total_subscription_price(11)); + fn when_get_11_subscriptions_return_2409_euros() -> Result<(), String> { + assert_eq!(2409, get_total_subscription_price(11)?); + Ok(()) } #[test] - fn when_get_25_subscriptions_return_5475_euros() { - assert_eq!(5475, get_total_subscription_price(25)); + fn when_get_25_subscriptions_return_5475_euros() -> Result<(), String> { + assert_eq!(5475, get_total_subscription_price(25)?); + Ok(()) } #[test] - fn when_get_26_subscriptions_return_5174_euros() { - assert_eq!(5174, get_total_subscription_price(26)); + fn when_get_26_subscriptions_return_5174_euros() -> Result<(), String> { + assert_eq!(5174, get_total_subscription_price(26)?); + Ok(()) } #[test] - fn when_get_50_subscriptions_return_9950_euros() { - assert_eq!(9950, get_total_subscription_price(50)); + fn when_get_50_subscriptions_return_9950_euros() -> Result<(), String> { + assert_eq!(9950, get_total_subscription_price(50)?); + Ok(()) } #[test] - fn when_get_51_subscriptions_return_7599_euros() { - assert_eq!(7599, get_total_subscription_price(51)); + fn when_get_51_subscriptions_return_7599_euros() -> Result<(), String> { + assert_eq!(7599, get_total_subscription_price(51)?); + Ok(()) } #[test] - fn when_get_52_subscriptions_return_7748_euros() { - assert_eq!(7748, get_total_subscription_price(52)); + fn when_get_52_subscriptions_return_7748_euros() -> Result<(), String> { + assert_eq!(7748, get_total_subscription_price(52)?); + Ok(()) + } + + #[test] + fn when_get_0_subscriptions_return_error() { + assert!(get_total_subscription_price(0).is_err()); } } From dbab0594459ee976c8f0b8c6887d3be6d086c45e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 23:15:54 +0100 Subject: [PATCH 40/48] =?UTF-8?q?=F0=9F=9F=A2=20Add=20implementation=20for?= =?UTF-8?q?=200=20subscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/tiered_pricing.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index ce44ecd4..83c02d82 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -6,6 +6,7 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> Result Err("Error".to_string()), 1|2 => Ok(FIRST_UNIT_PRICE * number_of_subscriptions), 3..=10 => Ok(SECOND_UNIT_PRICE * number_of_subscriptions), 11..=25 => Ok(THIRD_UNIT_PRICE * number_of_subscriptions), From 9192d18dd036bf96fdb5a4349ee5bb3e148af723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 23:23:12 +0100 Subject: [PATCH 41/48] =?UTF-8?q?=F0=9F=94=B5=20Extract=20unit=20price=20c?= =?UTF-8?q?alculator=20to=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../isaac1024_baby-steps/src/tiered_pricing.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 83c02d82..27d15aee 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,4 +1,4 @@ -fn get_total_subscription_price(number_of_subscriptions: u32) -> Result { +fn get_unit_price(number_of_subscriptions: u32) -> Result { const FIRST_UNIT_PRICE: u32 = 299; const SECOND_UNIT_PRICE: u32 = 239; const THIRD_UNIT_PRICE: u32 = 219; @@ -7,14 +7,18 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> Result Err("Error".to_string()), - 1|2 => Ok(FIRST_UNIT_PRICE * number_of_subscriptions), - 3..=10 => Ok(SECOND_UNIT_PRICE * number_of_subscriptions), - 11..=25 => Ok(THIRD_UNIT_PRICE * number_of_subscriptions), - 26..=50 => Ok(FOURTH_UNIT_PRICE * number_of_subscriptions), - _ => Ok(FIFTH_UNIT_PRICE * number_of_subscriptions), + 1|2 => Ok(FIRST_UNIT_PRICE), + 3..=10 => Ok(SECOND_UNIT_PRICE), + 11..=25 => Ok(THIRD_UNIT_PRICE), + 26..=50 => Ok(FOURTH_UNIT_PRICE), + _ => Ok(FIFTH_UNIT_PRICE), } } +fn get_total_subscription_price(number_of_subscriptions: u32) -> Result { + Ok(number_of_subscriptions * get_unit_price(number_of_subscriptions)?) +} + #[cfg(test)] mod tests { use crate::tiered_pricing::get_total_subscription_price; From d204f2cd7a48e7c6cc92b9cc9c46342aa37aec50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Fri, 25 Mar 2022 23:49:10 +0100 Subject: [PATCH 42/48] =?UTF-8?q?=F0=9F=94=B5=20Refactor=20error=20result?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/tiered_pricing.rs | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 27d15aee..e0c4b6b7 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,4 +1,17 @@ -fn get_unit_price(number_of_subscriptions: u32) -> Result { +use std::fmt; + +type SubscriptionResult = Result; + +#[derive(Debug)] +struct NumberSubscriptionsError; + +impl fmt::Display for NumberSubscriptionsError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "Subscriptions must be greater than 0") + } +} + +fn get_unit_price(number_of_subscriptions: u32) -> SubscriptionResult { const FIRST_UNIT_PRICE: u32 = 299; const SECOND_UNIT_PRICE: u32 = 239; const THIRD_UNIT_PRICE: u32 = 219; @@ -6,7 +19,7 @@ fn get_unit_price(number_of_subscriptions: u32) -> Result { const FIFTH_UNIT_PRICE: u32 = 149; match number_of_subscriptions { - 0 => Err("Error".to_string()), + 0 => Err(NumberSubscriptionsError), 1|2 => Ok(FIRST_UNIT_PRICE), 3..=10 => Ok(SECOND_UNIT_PRICE), 11..=25 => Ok(THIRD_UNIT_PRICE), @@ -15,70 +28,70 @@ fn get_unit_price(number_of_subscriptions: u32) -> Result { } } -fn get_total_subscription_price(number_of_subscriptions: u32) -> Result { +fn get_total_subscription_price(number_of_subscriptions: u32) -> SubscriptionResult { Ok(number_of_subscriptions * get_unit_price(number_of_subscriptions)?) } #[cfg(test)] mod tests { - use crate::tiered_pricing::get_total_subscription_price; + use crate::tiered_pricing::{get_total_subscription_price, NumberSubscriptionsError}; #[test] - fn when_get_a_subscription_return_299_euros() -> Result<(), String> { + fn when_get_a_subscription_return_299_euros() -> Result<(), NumberSubscriptionsError> { assert_eq!(299, get_total_subscription_price(1)?); Ok(()) } #[test] - fn when_get_2_subscriptions_return_598_euros() -> Result<(), String> { + fn when_get_2_subscriptions_return_598_euros() -> Result<(), NumberSubscriptionsError> { assert_eq!(598, get_total_subscription_price(2)?); Ok(()) } #[test] - fn when_get_3_subscriptions_return_717_euros() -> Result<(), String> { + fn when_get_3_subscriptions_return_717_euros() -> Result<(), NumberSubscriptionsError> { assert_eq!(717, get_total_subscription_price(3)?); Ok(()) } #[test] - fn when_get_10_subscriptions_return_2390_euros() -> Result<(), String> { + fn when_get_10_subscriptions_return_2390_euros() -> Result<(), NumberSubscriptionsError> { assert_eq!(2390, get_total_subscription_price(10)?); Ok(()) } #[test] - fn when_get_11_subscriptions_return_2409_euros() -> Result<(), String> { + fn when_get_11_subscriptions_return_2409_euros() -> Result<(), NumberSubscriptionsError> { assert_eq!(2409, get_total_subscription_price(11)?); Ok(()) } #[test] - fn when_get_25_subscriptions_return_5475_euros() -> Result<(), String> { + fn when_get_25_subscriptions_return_5475_euros() -> Result<(), NumberSubscriptionsError> { assert_eq!(5475, get_total_subscription_price(25)?); Ok(()) } #[test] - fn when_get_26_subscriptions_return_5174_euros() -> Result<(), String> { + fn when_get_26_subscriptions_return_5174_euros() -> Result<(), NumberSubscriptionsError> { assert_eq!(5174, get_total_subscription_price(26)?); Ok(()) } #[test] - fn when_get_50_subscriptions_return_9950_euros() -> Result<(), String> { + fn when_get_50_subscriptions_return_9950_euros() -> Result<(), NumberSubscriptionsError> { assert_eq!(9950, get_total_subscription_price(50)?); Ok(()) } #[test] - fn when_get_51_subscriptions_return_7599_euros() -> Result<(), String> { + fn when_get_51_subscriptions_return_7599_euros() -> Result<(), NumberSubscriptionsError> { assert_eq!(7599, get_total_subscription_price(51)?); Ok(()) } #[test] - fn when_get_52_subscriptions_return_7748_euros() -> Result<(), String> { + fn when_get_52_subscriptions_return_7748_euros() -> Result<(), NumberSubscriptionsError> { assert_eq!(7748, get_total_subscription_price(52)?); Ok(()) } From 7f31984628b6ab8ede60a3ee2b564dfc412cd8e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Sat, 26 Mar 2022 00:45:27 +0100 Subject: [PATCH 43/48] =?UTF-8?q?=F0=9F=94=B5=20Refactor=20test=20to=20imp?= =?UTF-8?q?lement=20fake=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/Cargo.lock | 11 +++ .../solutions/isaac1024_baby-steps/Cargo.toml | 4 + .../src/tiered_pricing.rs | 78 ++++++++++--------- 3 files changed, 57 insertions(+), 36 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock index ffff1399..32810bab 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock @@ -377,6 +377,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "fake" +version = "2.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a8531dd3a64fd1cfbe92fad4160bc2060489c6195fe847e045e5788f710bae" +dependencies = [ + "rand", +] + [[package]] name = "firestorm" version = "0.5.0" @@ -826,6 +835,8 @@ name = "rust-base-skeleton" version = "0.1.0" dependencies = [ "actix-web", + "fake", + "rand", ] [[package]] diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml index b140e3be..21e70d20 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml @@ -5,3 +5,7 @@ edition = "2021" [dependencies] actix-web = "4" + +[dev-dependencies] +fake = "2.4" +rand = "0.8" diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index e0c4b6b7..9008c2c5 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -20,7 +20,7 @@ fn get_unit_price(number_of_subscriptions: u32) -> SubscriptionResult { match number_of_subscriptions { 0 => Err(NumberSubscriptionsError), - 1|2 => Ok(FIRST_UNIT_PRICE), + 1 | 2 => Ok(FIRST_UNIT_PRICE), 3..=10 => Ok(SECOND_UNIT_PRICE), 11..=25 => Ok(THIRD_UNIT_PRICE), 26..=50 => Ok(FOURTH_UNIT_PRICE), @@ -35,64 +35,70 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> SubscriptionRes #[cfg(test)] mod tests { use crate::tiered_pricing::{get_total_subscription_price, NumberSubscriptionsError}; + use fake::Fake; #[test] - fn when_get_a_subscription_return_299_euros() -> Result<(), NumberSubscriptionsError> { - assert_eq!(299, get_total_subscription_price(1)?); - Ok(()) - } + fn when_subscriptions_are_between_1_and_2_unit_price_is_299( + ) -> Result<(), NumberSubscriptionsError> { + let number_of_subscriptions = (1..=2).fake(); - #[test] - fn when_get_2_subscriptions_return_598_euros() -> Result<(), NumberSubscriptionsError> { - assert_eq!(598, get_total_subscription_price(2)?); - Ok(()) - } + assert_eq!( + number_of_subscriptions * 299, + get_total_subscription_price(number_of_subscriptions)? + ); - #[test] - fn when_get_3_subscriptions_return_717_euros() -> Result<(), NumberSubscriptionsError> { - assert_eq!(717, get_total_subscription_price(3)?); Ok(()) } #[test] - fn when_get_10_subscriptions_return_2390_euros() -> Result<(), NumberSubscriptionsError> { - assert_eq!(2390, get_total_subscription_price(10)?); - Ok(()) - } + fn when_subscriptions_are_between_3_and_10_unit_price_is_239( + ) -> Result<(), NumberSubscriptionsError> { + let number_of_subscriptions = (3..=10).fake(); - #[test] - fn when_get_11_subscriptions_return_2409_euros() -> Result<(), NumberSubscriptionsError> { - assert_eq!(2409, get_total_subscription_price(11)?); - Ok(()) - } + assert_eq!( + number_of_subscriptions * 239, + get_total_subscription_price(number_of_subscriptions)? + ); - #[test] - fn when_get_25_subscriptions_return_5475_euros() -> Result<(), NumberSubscriptionsError> { - assert_eq!(5475, get_total_subscription_price(25)?); Ok(()) } #[test] - fn when_get_26_subscriptions_return_5174_euros() -> Result<(), NumberSubscriptionsError> { - assert_eq!(5174, get_total_subscription_price(26)?); - Ok(()) - } + fn when_subscriptions_are_between_11_and_25_unit_price_is_219( + ) -> Result<(), NumberSubscriptionsError> { + let number_of_subscriptions = (11..=25).fake(); + + assert_eq!( + number_of_subscriptions * 219, + get_total_subscription_price(number_of_subscriptions)? + ); - #[test] - fn when_get_50_subscriptions_return_9950_euros() -> Result<(), NumberSubscriptionsError> { - assert_eq!(9950, get_total_subscription_price(50)?); Ok(()) } #[test] - fn when_get_51_subscriptions_return_7599_euros() -> Result<(), NumberSubscriptionsError> { - assert_eq!(7599, get_total_subscription_price(51)?); + fn when_subscriptions_are_between_26_and_50_unit_price_is_199( + ) -> Result<(), NumberSubscriptionsError> { + let number_of_subscriptions = (26..=50).fake(); + + assert_eq!( + number_of_subscriptions * 199, + get_total_subscription_price(number_of_subscriptions)? + ); + Ok(()) } #[test] - fn when_get_52_subscriptions_return_7748_euros() -> Result<(), NumberSubscriptionsError> { - assert_eq!(7748, get_total_subscription_price(52)?); + fn when_subscriptions_are_more_than_50_unit_price_is_149( + ) -> Result<(), NumberSubscriptionsError> { + let number_of_subscriptions = (51..1000).fake(); + + assert_eq!( + number_of_subscriptions * 149, + get_total_subscription_price(number_of_subscriptions)? + ); + Ok(()) } From 57ff9353e3f8163d6fe8ebc2a7fa1c3982171d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Tue, 29 Mar 2022 22:23:00 +0200 Subject: [PATCH 44/48] =?UTF-8?q?=F0=9F=94=B4=20Add=20actix=20web=20integr?= =?UTF-8?q?ation=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/Cargo.lock | 56 ++++++++++++++----- .../solutions/isaac1024_baby-steps/Cargo.toml | 2 + .../solutions/isaac1024_baby-steps/README.md | 4 +- .../isaac1024_baby-steps/src/health_check.rs | 9 ++- .../isaac1024_baby-steps/src/routes.rs | 4 +- .../src/tiered_pricing.rs | 42 +++++++++++--- 6 files changed, 88 insertions(+), 29 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock index 32810bab..ebb8b689 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.lock @@ -16,7 +16,7 @@ dependencies = [ "memchr", "pin-project-lite", "tokio", - "tokio-util 0.7.0", + "tokio-util 0.7.1", ] [[package]] @@ -462,9 +462,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if", "libc", @@ -728,9 +728,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" [[package]] name = "percent-encoding" @@ -767,9 +767,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4af2ec4714533fcdf07e886f17025ace8b997b9ce51204ee69b6da831c3da57" +checksum = "632d02bff7f874a36f33ea8bb416cd484b90cc66c1194b1a1110d067a7013f58" dependencies = [ "proc-macro2", ] @@ -837,6 +837,8 @@ dependencies = [ "actix-web", "fake", "rand", + "serde", + "serde_json", ] [[package]] @@ -862,15 +864,29 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "semver" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d" +checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4" [[package]] name = "serde" version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "serde_json" @@ -939,9 +955,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.89" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54" +checksum = "704df27628939572cd88d33f171cd6f896f4eaca85252c6e0a72d8d8287ee86f" dependencies = [ "proc-macro2", "quote", @@ -1015,16 +1031,16 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64910e1b9c1901aaf5375561e35b9c057d95ff41a44ede043a03e09279eabaf1" +checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" dependencies = [ "bytes", "futures-core", "futures-sink", - "log", "pin-project-lite", "tokio", + "tracing", ] [[package]] @@ -1036,9 +1052,21 @@ dependencies = [ "cfg-if", "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tracing-core" version = "0.1.23" diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml index 21e70d20..9b53ba01 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/Cargo.toml @@ -5,6 +5,8 @@ edition = "2021" [dependencies] actix-web = "4" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" [dev-dependencies] fake = "2.4" diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/README.md b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/README.md index 661ca4ea..48bd18aa 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/README.md +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/README.md @@ -1,8 +1,8 @@ -# Rust base skeleton for TDD katas +# Tiered pricing kata with rust ## Run app -`make up` default url: http://localhost:8000/health-check +`make up` url example: http://localhost:8000/pricing?subscriptions=1 ## Run tests diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/health_check.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/health_check.rs index e098e2db..b1e16c72 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/health_check.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/health_check.rs @@ -7,19 +7,18 @@ pub async fn health_check() -> impl Responder { #[cfg(test)] mod tests { use super::*; - use actix_web::{App, test, web}; + use actix_web::{test, web, App}; #[actix_web::test] async fn health_check_return_ok() { - let app = test::init_service( - App::new().route("/health-check", web::get().to(health_check)) - ).await; + let app = + test::init_service(App::new().route("/health-check", web::get().to(health_check))) + .await; let request = test::TestRequest::get().uri("/health-check").to_request(); let response = test::call_service(&app, request).await; - println!("{:?}", response.status()); assert!(response.status().is_success()); } } diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs index ae5a8369..7697c4f1 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs @@ -1,6 +1,8 @@ -use actix_web::web; use crate::health_check::health_check; +use crate::tiered_pricing::tiered_pricing; +use actix_web::web; pub fn routes(cfg: &mut web::ServiceConfig) { cfg.route("/health-check", web::get().to(health_check)); + cfg.route("/pricing", web::get().to(tiered_pricing)); } diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 9008c2c5..c1662aa7 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,5 +1,16 @@ +use actix_web::{HttpResponse, Responder}; +use serde::{Deserialize, Serialize}; use std::fmt; +#[derive(Serialize, Deserialize)] +struct Subscriptions { + pricing: u32, +} + +pub async fn tiered_pricing() -> impl Responder { + HttpResponse::Ok().json(Subscriptions { pricing: 0 }) +} + type SubscriptionResult = Result; #[derive(Debug)] @@ -34,11 +45,12 @@ fn get_total_subscription_price(number_of_subscriptions: u32) -> SubscriptionRes #[cfg(test)] mod tests { - use crate::tiered_pricing::{get_total_subscription_price, NumberSubscriptionsError}; + use super::*; + use actix_web::{test, web, App}; use fake::Fake; #[test] - fn when_subscriptions_are_between_1_and_2_unit_price_is_299( + async fn when_subscriptions_are_between_1_and_2_unit_price_is_299( ) -> Result<(), NumberSubscriptionsError> { let number_of_subscriptions = (1..=2).fake(); @@ -51,7 +63,7 @@ mod tests { } #[test] - fn when_subscriptions_are_between_3_and_10_unit_price_is_239( + async fn when_subscriptions_are_between_3_and_10_unit_price_is_239( ) -> Result<(), NumberSubscriptionsError> { let number_of_subscriptions = (3..=10).fake(); @@ -64,7 +76,7 @@ mod tests { } #[test] - fn when_subscriptions_are_between_11_and_25_unit_price_is_219( + async fn when_subscriptions_are_between_11_and_25_unit_price_is_219( ) -> Result<(), NumberSubscriptionsError> { let number_of_subscriptions = (11..=25).fake(); @@ -77,7 +89,7 @@ mod tests { } #[test] - fn when_subscriptions_are_between_26_and_50_unit_price_is_199( + async fn when_subscriptions_are_between_26_and_50_unit_price_is_199( ) -> Result<(), NumberSubscriptionsError> { let number_of_subscriptions = (26..=50).fake(); @@ -90,7 +102,7 @@ mod tests { } #[test] - fn when_subscriptions_are_more_than_50_unit_price_is_149( + async fn when_subscriptions_are_more_than_50_unit_price_is_149( ) -> Result<(), NumberSubscriptionsError> { let number_of_subscriptions = (51..1000).fake(); @@ -103,7 +115,23 @@ mod tests { } #[test] - fn when_get_0_subscriptions_return_error() { + async fn when_get_0_subscriptions_return_error() { assert!(get_total_subscription_price(0).is_err()); } + + #[actix_web::test] + async fn when_send_n_subscriptions_return_price() { + let number_of_subscriptions: u32 = (51..1000).fake(); + + let app = + test::init_service(App::new().route("/pricing", web::get().to(tiered_pricing))).await; + + let request = test::TestRequest::get() + .uri(format!("/pricing?subscriptions={}", number_of_subscriptions).as_str()) + .to_request(); + + let response: Subscriptions = test::call_and_read_body_json(&app, request).await; + + assert_eq!(number_of_subscriptions * 149, response.pricing); + } } From d581864a0981502407cf5c6e2cc261aedabe267e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Tue, 29 Mar 2022 22:34:11 +0200 Subject: [PATCH 45/48] =?UTF-8?q?=F0=9F=9F=A2=20Implement=20controller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../isaac1024_baby-steps/src/tiered_pricing.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index c1662aa7..b811fe30 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -1,14 +1,22 @@ -use actix_web::{HttpResponse, Responder}; +use actix_web::{web, HttpResponse, Responder}; use serde::{Deserialize, Serialize}; use std::fmt; +#[derive(Deserialize)] +pub struct Pricing { + subscriptions: u32, +} + #[derive(Serialize, Deserialize)] struct Subscriptions { pricing: u32, } -pub async fn tiered_pricing() -> impl Responder { - HttpResponse::Ok().json(Subscriptions { pricing: 0 }) +pub async fn tiered_pricing(pricing: web::Query) -> impl Responder { + let total_price = get_total_subscription_price(pricing.subscriptions).unwrap(); + HttpResponse::Ok().json(Subscriptions { + pricing: total_price, + }) } type SubscriptionResult = Result; From 540829b4a9d9cccbeb284a30585f1c1df4d4003a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Tue, 29 Mar 2022 22:39:01 +0200 Subject: [PATCH 46/48] =?UTF-8?q?=F0=9F=94=B4=20Add=20integration=20test?= =?UTF-8?q?=20bad=20request?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../isaac1024_baby-steps/src/tiered_pricing.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index b811fe30..e5a77a1b 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -142,4 +142,18 @@ mod tests { assert_eq!(number_of_subscriptions * 149, response.pricing); } + + #[actix_web::test] + async fn when_send_0_subscriptions_return_bad_request() { + let app = + test::init_service(App::new().route("/pricing", web::get().to(tiered_pricing))).await; + + let request = test::TestRequest::get() + .uri("/pricing?subscriptions=0") + .to_request(); + + let response = test::call_service(&app, request).await; + + assert!(response.status().is_client_error()) + } } From 73c663cdb50d8008c16821b49ef4712e5b5cb844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Tue, 29 Mar 2022 22:44:17 +0200 Subject: [PATCH 47/48] =?UTF-8?q?=F0=9F=9F=A2=20Return=20bad=20request=20w?= =?UTF-8?q?hen=20subscriptions=20is=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../isaac1024_baby-steps/src/tiered_pricing.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index e5a77a1b..81cc6dde 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -12,11 +12,20 @@ struct Subscriptions { pricing: u32, } +#[derive(Serialize, Deserialize)] +struct BadRequestMessage { + error_message: String, +} + pub async fn tiered_pricing(pricing: web::Query) -> impl Responder { - let total_price = get_total_subscription_price(pricing.subscriptions).unwrap(); - HttpResponse::Ok().json(Subscriptions { - pricing: total_price, - }) + match get_total_subscription_price(pricing.subscriptions) { + Ok(total_price) => HttpResponse::Ok().json(Subscriptions { + pricing: total_price, + }), + Err(error) => HttpResponse::BadRequest().json(BadRequestMessage { + error_message: error.to_string(), + }), + } } type SubscriptionResult = Result; From 708edece9b1d25fdb863454d2e77b22fcb31f87b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Abreu=20Rodr=C3=ADguez?= Date: Tue, 29 Mar 2022 23:05:17 +0200 Subject: [PATCH 48/48] =?UTF-8?q?=F0=9F=94=B5=20Better=20names?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solutions/isaac1024_baby-steps/src/main.rs | 10 +++------- .../solutions/isaac1024_baby-steps/src/routes.rs | 4 ++-- .../isaac1024_baby-steps/src/tiered_pricing.rs | 16 +++++++--------- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs index 660e00aa..92ed4506 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/main.rs @@ -1,5 +1,5 @@ -mod routes; mod health_check; +mod routes; mod tiered_pricing; use actix_web::{App, HttpServer}; @@ -14,17 +14,13 @@ fn get_address() -> String { #[actix_web::main] async fn main() -> std::io::Result<()> { - let server = HttpServer::new( || { - App::new() - .configure(routes) - }) - .bind(get_address()); + let server = HttpServer::new(|| App::new().configure(routes)).bind(get_address()); match server { Ok(server) => { println!("🚀 Server running at {}", get_address()); server.run().await } - Err(_) => panic!("🔥 Coul not start the server at {}", get_address()) + Err(_) => panic!("🔥 Could not start the server at {}", get_address()), } } diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs index 7697c4f1..c73525e7 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/routes.rs @@ -3,6 +3,6 @@ use crate::tiered_pricing::tiered_pricing; use actix_web::web; pub fn routes(cfg: &mut web::ServiceConfig) { - cfg.route("/health-check", web::get().to(health_check)); - cfg.route("/pricing", web::get().to(tiered_pricing)); + cfg.route("/health-check", web::get().to(health_check)) + .route("/pricing", web::get().to(tiered_pricing)); } diff --git a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs index 81cc6dde..b1cd7038 100644 --- a/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs +++ b/exercises/tiered_pricing/solutions/isaac1024_baby-steps/src/tiered_pricing.rs @@ -3,13 +3,13 @@ use serde::{Deserialize, Serialize}; use std::fmt; #[derive(Deserialize)] -pub struct Pricing { +pub struct TieredPricingQuery { subscriptions: u32, } #[derive(Serialize, Deserialize)] -struct Subscriptions { - pricing: u32, +struct TieredPricingResponse { + total_price: u32, } #[derive(Serialize, Deserialize)] @@ -17,11 +17,9 @@ struct BadRequestMessage { error_message: String, } -pub async fn tiered_pricing(pricing: web::Query) -> impl Responder { +pub async fn tiered_pricing(pricing: web::Query) -> impl Responder { match get_total_subscription_price(pricing.subscriptions) { - Ok(total_price) => HttpResponse::Ok().json(Subscriptions { - pricing: total_price, - }), + Ok(total_price) => HttpResponse::Ok().json(TieredPricingResponse { total_price }), Err(error) => HttpResponse::BadRequest().json(BadRequestMessage { error_message: error.to_string(), }), @@ -147,9 +145,9 @@ mod tests { .uri(format!("/pricing?subscriptions={}", number_of_subscriptions).as_str()) .to_request(); - let response: Subscriptions = test::call_and_read_body_json(&app, request).await; + let response: TieredPricingResponse = test::call_and_read_body_json(&app, request).await; - assert_eq!(number_of_subscriptions * 149, response.pricing); + assert_eq!(number_of_subscriptions * 149, response.total_price); } #[actix_web::test]