Compare commits
1228 Commits
all-contri
...
main
Author | SHA1 | Date |
---|---|---|
liv | 06f865307f | |
allcontributors[bot] | f86a3c5ddc | |
allcontributors[bot] | 666857dc4e | |
liv | 1552822404 | |
Ofir Lauber | 83ac243c00 | |
liv | 9a743f80c5 | |
liv | 170aaabe9b | |
liv | ef122c9973 | |
allcontributors[bot] | 8e8c74c6c0 | |
allcontributors[bot] | a38840ae92 | |
liv | 2e48fe9cc7 | |
liv | 3b451e4ab1 | |
allcontributors[bot] | 746180b153 | |
allcontributors[bot] | 62415f758b | |
liv | 0807353bf0 | |
liv | a808cf71a3 | |
liv | 8716558696 | |
Luka Krmpotic | eb84eaf151 | |
Jurglic | a0699bd917 | |
Jon Erling Hustadnes | 0ee9c5b776 | |
liv | 51c8da06b0 | |
allcontributors[bot] | 95640cba23 | |
allcontributors[bot] | 241889159a | |
liv | edb8813cc7 | |
Charles Hall | 4a1290cb66 | |
liv | d52ce2d354 | |
allcontributors[bot] | b33ef03ac6 | |
allcontributors[bot] | dceba07e82 | |
liv | e12504a61d | |
liv | 9de22c9afa | |
allcontributors[bot] | e17d603201 | |
allcontributors[bot] | 47fbd6d160 | |
liv | 9dc8f13925 | |
Oscar Bonilla | 33a4f4e454 | |
Jon Erling Hustadnes | a5e4133516 | |
liv | 4d04aad890 | |
liv | 847b57423f | |
liv | 58cabf2ebd | |
liv | ae28d2fa2d | |
liv | de45998f69 | |
liv | 0d36050b36 | |
liv | f31a18429b | |
liv | 3ad30308ec | |
liv | 6c0c397507 | |
liv | 42da308140 | |
allcontributors[bot] | 680a32a85c | |
allcontributors[bot] | 951dde4e94 | |
liv | 14fbdd20ac | |
liv | ad0fad4218 | |
liv | a5fe578e79 | |
allcontributors[bot] | d5525794f8 | |
allcontributors[bot] | 3f7ef6fe33 | |
liv | 992e5163d3 | |
liv | d03f624357 | |
allcontributors[bot] | b547321868 | |
allcontributors[bot] | 9a0e5bd003 | |
liv | c57ad35e5b | |
liv | f7ef198e3a | |
allcontributors[bot] | fcac2b553c | |
allcontributors[bot] | e8c2d27b4a | |
liv | 630cbf8f85 | |
liv | 0aa9418736 | |
liv | abc3013096 | |
liv | 51e237d5f9 | |
liv | 6eb9bde786 | |
allcontributors[bot] | dce89aefb9 | |
allcontributors[bot] | 47e14cff8d | |
liv | 4d9b68b377 | |
liv | a8f4994935 | |
allcontributors[bot] | 8ca60f2cbb | |
allcontributors[bot] | bb550497d5 | |
liv | 849e4a3647 | |
liv | c177507db3 | |
liv | a09a0c47ae | |
liv | a26c396335 | |
allcontributors[bot] | 4aa5ca2818 | |
allcontributors[bot] | 27881a83d4 | |
liv | 6378c2a81f | |
liv | 45cadcf020 | |
allcontributors[bot] | 7d53abdb0a | |
allcontributors[bot] | a059ded709 | |
liv | 4de3b4a635 | |
liv | 64162d3a24 | |
liv | 626e2749a6 | |
liv | b39d896db7 | |
allcontributors[bot] | 4a9699226a | |
allcontributors[bot] | 11f4ec93ac | |
liv | e57797a8ff | |
liv | 0b7975b195 | |
mo8it | 362318a6e0 | |
mo8it | 5a93f2a4f1 | |
x10an14 | e7bdc83a8f | |
x10an14 | 60b8487600 | |
x10an14 | 013f22c89c | |
liv | 2d1da2ab57 | |
mo8it | 9c0581bc0f | |
liv | d79984dbda | |
liv | c2eaa8f019 | |
liv | 6c517199bf | |
allcontributors[bot] | d258c30406 | |
allcontributors[bot] | 7bb69f8641 | |
liv | c1051f3f52 | |
mo8it | 193b600382 | |
mo8it | 16936d95d1 | |
mo8it | 64224d3918 | |
mo8it | c0b8af2c42 | |
mo8it | c655612d2d | |
mo8it | 3cc9be0d11 | |
mo8it | 571bab20c1 | |
liv | c663f06669 | |
allcontributors[bot] | 77f0e177e6 | |
allcontributors[bot] | e7ad540618 | |
liv | 38b4327f41 | |
Ivan Vasiunyk | fa0463b3b2 | |
Roi Gabay | af76794627 | |
liv | 464cb5566d | |
allcontributors[bot] | d670847308 | |
allcontributors[bot] | 33a45d0f89 | |
liv | da395fed20 | |
Kevin C | ad1c29c512 | |
Mate Kovacs | 720f33eee6 | |
liv | 64035f766f | |
allcontributors[bot] | 1ace9795f7 | |
allcontributors[bot] | 24c838bc0b | |
liv | b64aa9993b | |
Alon Hearter | 2691a35102 | |
Joshua Carlson | 828e724659 | |
liv | 11d8aea96f | |
allcontributors[bot] | 62adbdf7f2 | |
allcontributors[bot] | f39df76215 | |
liv | 4d26307cfc | |
Marcus Höjvall | be8d1df8b9 | |
liv | 4592b4c409 | |
allcontributors[bot] | bb5fa3f1e8 | |
allcontributors[bot] | 8283ae8c4c | |
liv | 478e9d67df | |
Alexander González | ef8f1f108b | |
Gabor Szabo | 7f9f897945 | |
Yamila Moreno | 662e5bddd7 | |
liv | b949422d46 | |
allcontributors[bot] | 2c7dec7327 | |
allcontributors[bot] | f4d86f384c | |
liv | 13bbe9c07d | |
Nicholas R. Smith | 2934d062a3 | |
Will Hack | 37cdea9183 | |
liv | a7300da78d | |
allcontributors[bot] | 176fb7c447 | |
allcontributors[bot] | 0e0c5dfe99 | |
liv | 6cc34fa1f7 | |
Joshua Carlson | 287172698a | |
Will Hack | 0ab781c7a7 | |
liv | c5b0627180 | |
Will Hack | b99c7b8c37 | |
liv | a6b562b8e4 | |
allcontributors[bot] | a46d42f45e | |
allcontributors[bot] | 47b3a53132 | |
liv | a470500a43 | |
vnprc | 405b32e77a | |
liv | 2584ff0440 | |
allcontributors[bot] | 2e4022dd73 | |
allcontributors[bot] | f03a915c75 | |
liv | 9379d06275 | |
Anish | eacf7db6f3 | |
liv | adc7ca5690 | |
Mohammed Sadiq | c5231f0ce3 | |
liv | c2264cabae | |
liv | f3d0ba2f51 | |
allcontributors[bot] | 0cb63cdd01 | |
allcontributors[bot] | c236a80a37 | |
liv | 4b9e77d2ef | |
tajo48 | e1704a2f1b | |
liv | 0282da6881 | |
allcontributors[bot] | 846e68e1aa | |
allcontributors[bot] | 33cf4f7eca | |
liv | 132d5ca943 | |
liv | b44472b237 | |
liv | 4cfcf2ccd7 | |
allcontributors[bot] | a2f99ad00d | |
allcontributors[bot] | eb3c9658b1 | |
liv | 06ddcfb0bb | |
liv | d6bb8547b3 | |
allcontributors[bot] | 5219621595 | |
allcontributors[bot] | a14f0c3f55 | |
liv | 44f706a5e7 | |
liv | 55636e6978 | |
allcontributors[bot] | 5921948de8 | |
allcontributors[bot] | bd05bab4bf | |
liv | c6c7dd2fce | |
liv | 171d20ce3e | |
liv | c2bb9ebd8e | |
allcontributors[bot] | d35a352fe6 | |
allcontributors[bot] | 4fd52390ee | |
liv | 974717ca11 | |
liv | d77e6c0d05 | |
allcontributors[bot] | 47fcab1e60 | |
allcontributors[bot] | a1188ca0ee | |
liv | 0d2a1bdef1 | |
liv | 369ae2e63d | |
liv | 1ce9d93e94 | |
allcontributors[bot] | e0ea03dc56 | |
allcontributors[bot] | 3cced07c13 | |
liv | dca6e869df | |
alex | f30f0bf148 | |
IVIURARY | d0a1783083 | |
Bert Apperlo | a4fe3602b2 | |
Bert Apperlo | 8974e33f69 | |
Bert Apperlo | bbfb4c7e63 | |
Florine W. Dekker | 479574e88e | |
luhem7 | a96bbcd967 | |
tajo48 | 1e02f194fd | |
Robert Fry | 7eef5d15ee | |
liv | 30291a3c25 | |
allcontributors[bot] | 33224370eb | |
allcontributors[bot] | b9cb931167 | |
liv | 10d8357876 | |
lazywalker | 9604ab6621 | |
liv | e35a84fcb3 | |
liv | e910205c19 | |
allcontributors[bot] | 15ad02c984 | |
allcontributors[bot] | 8e62346f86 | |
liv | 59344c679d | |
b1ue64 | a7257a1d1e | |
liv | f2de12aa34 | |
liv | 2d544f18b5 | |
liv | 0667ee7c4d | |
liv | 19cee73209 | |
liv | 4c638e365f | |
liv | f452fd7bb0 | |
liv | 6d1f8c5111 | |
allcontributors[bot] | ab61a0d5c7 | |
allcontributors[bot] | af52fce275 | |
liv | 656140d9e6 | |
liv | 9508e97914 | |
liv | a6f99645c6 | |
liv | fd84c2d8f7 | |
allcontributors[bot] | eeb439eaf9 | |
allcontributors[bot] | 58cbdd71b6 | |
liv | 81cd97902a | |
liv | ccf4a78f5d | |
allcontributors[bot] | 6abff39549 | |
allcontributors[bot] | 94c6131c59 | |
liv | 05fcc246ae | |
liv | 9bfb7055e2 | |
allcontributors[bot] | c5fe42089d | |
allcontributors[bot] | 70cf7698ac | |
liv | b07680108b | |
liv | d45ec21b3c | |
allcontributors[bot] | 0d252636be | |
allcontributors[bot] | 70da26f649 | |
liv | b882da1ad4 | |
Noah May | 3ecb47ff2c | |
Romain Bayle | c44e3025f9 | |
liv | 9ffcab07bf | |
allcontributors[bot] | 583925c085 | |
allcontributors[bot] | e631f3c78b | |
liv | 9a6e57eec9 | |
Aaron Wang | d3fea5f15a | |
Romain Bayle | 5d3696a9e6 | |
liv | b75d2aa3f4 | |
allcontributors[bot] | eb4079c674 | |
allcontributors[bot] | 72d0c53b33 | |
liv | 6ae0525f7a | |
PiqqiDesigns | c4627e7112 | |
liv | 6d4a980b04 | |
allcontributors[bot] | 545a726252 | |
allcontributors[bot] | 065cd0170e | |
liv | a7eeaa3a4b | |
deedy5 | e2da663628 | |
lionel-rowe | 836134202e | |
Alan Gerber | 319a8253ba | |
liv | fc81bb15fe | |
allcontributors[bot] | 6209e7004e | |
allcontributors[bot] | 4944488287 | |
liv | 0dc9c33b01 | |
Sebastian LaVine | a4a5691a7b | |
Your Name | 352267871c | |
bean5 | 15ae83f868 | |
bean5 | e6b1ef2049 | |
Aaron Wang | 8ed2cf7ef5 | |
J.c | 8cb5cba775 | |
Aaron Wang | c74e0bfd18 | |
liv | 9fc336c7f7 | |
allcontributors[bot] | 5de7124eee | |
allcontributors[bot] | 2f33826063 | |
liv | 087e076ec0 | |
liv | b39b819725 | |
allcontributors[bot] | d544bfcd6d | |
allcontributors[bot] | c7adaa7d14 | |
liv | f86fa1e909 | |
liv | 2285b89aea | |
allcontributors[bot] | 16ca871544 | |
allcontributors[bot] | 722c7910e4 | |
liv | ab6aa23cec | |
liv | 5fd3dfe01b | |
liv | 8a7f437641 | |
allcontributors[bot] | 63a467af31 | |
allcontributors[bot] | af365f444f | |
liv | 9a9b487abd | |
poneciak | 102d7f3d0e | |
poneciak | c4974ac782 | |
poneciak | 27b7579566 | |
liv | 01fa21f160 | |
allcontributors[bot] | 54d21dc7c1 | |
allcontributors[bot] | 2f2fd43771 | |
liv | 2ca4ee2a54 | |
Sagar Vora | b1fb38e73c | |
liv | 09dc7058c9 | |
allcontributors[bot] | 75f0ab65d1 | |
allcontributors[bot] | 391e5d121a | |
liv | 6f84887f60 | |
liv | 3e44060b5b | |
allcontributors[bot] | 84dcd51d37 | |
allcontributors[bot] | e185e27273 | |
liv | e2eb24761f | |
Alexandre ESSE | d7111cb4a3 | |
Alexandre ESSE | 22bb662d3e | |
Keogami | 8c4a7bea5f | |
Ali Afsharzadeh | 382e16eb7e | |
liv | 362c1b0d11 | |
Ali Afsharzadeh | 1db646474e | |
liv | fbec311844 | |
allcontributors[bot] | 347462d87e | |
allcontributors[bot] | 99bd7181f9 | |
liv | 92f09dbe81 | |
liv | 4b1fe0a1cc | |
allcontributors[bot] | 78f4d66364 | |
allcontributors[bot] | 13356e16a3 | |
liv | e0e0b3f387 | |
Ali Afsharzadeh | 592694036f | |
liv | b21a4ac12b | |
allcontributors[bot] | 5e43c7aba5 | |
allcontributors[bot] | db993899d3 | |
liv | e2de7b8ae3 | |
Vegard Matthey | 95e51f384e | |
liv | 4ff38c7bf3 | |
allcontributors[bot] | faf4d9a888 | |
allcontributors[bot] | 18a9510048 | |
liv | 2012641610 | |
liv | 864e741dd8 | |
liv | 22eb7e3847 | |
allcontributors[bot] | 766b83b513 | |
allcontributors[bot] | c28b78fae5 | |
liv | 6d4a87227d | |
liv | 65b8770ce9 | |
liv | 2ef6fb66ac | |
allcontributors[bot] | 82f72c3ec6 | |
allcontributors[bot] | efd4d83731 | |
liv | 8bab260587 | |
Tom Kunc | d5449c992e | |
Ed Sweeney | 4160b06c6c | |
Eugene | 6e9ed48f42 | |
Ryan Whitehouse | 5687676014 | |
hxztnxt | 5d91c86cf2 | |
liv | 9acefe8b3a | |
allcontributors[bot] | 06fac0e570 | |
allcontributors[bot] | e8b44a39e0 | |
liv | a55c8dc1a8 | |
Adam Brewer | 7bab78c66d | |
liv | 5c5cd4c658 | |
allcontributors[bot] | 53a8318f32 | |
allcontributors[bot] | 31b208248b | |
liv | 9c515c7863 | |
Sven Siegmund | ec86b60e70 | |
liv | 7f1754ecc5 | |
liv | e4971ec7b3 | |
allcontributors[bot] | ec974f5dac | |
allcontributors[bot] | 7b2bfda37f | |
liv | 2f34370f2f | |
liv | 94799b1e98 | |
allcontributors[bot] | d334e0c66c | |
allcontributors[bot] | 3da5816db2 | |
liv | c8273e06c6 | |
liv | ff50159a3d | |
Nidhal Messaoudi | 34aafa82f9 | |
Nidhal Messaoudi | 278a1f103b | |
Nidhal Messaoudi | 1acbbb6d43 | |
Nidhal Messaoudi | e3a20b8bc8 | |
Nidhal Messaoudi | f7678b4a9e | |
Nidhal Messaoudi | 52ed5dbcf9 | |
Mahdi Bahrami | 6c5ba7cc01 | |
liv | 36e66b545e | |
liv | 0e9966d6a4 | |
liv | 75fbf7a8f3 | |
liv | e700a3cc4d | |
allcontributors[bot] | eb7f21df04 | |
allcontributors[bot] | ac9c1adb75 | |
liv | d06f7bf1ff | |
allcontributors[bot] | 7f06bb5fa7 | |
allcontributors[bot] | 0ad8eec3eb | |
allcontributors[bot] | 3c841c4685 | |
liv | d5b647d5ab | |
Emmanuel Roullit | 86f8fa8e6e | |
Emmanuel Roullit | 351e4e2460 | |
Emmanuel Roullit | 1afc7ed8c5 | |
Emmanuel Roullit | fcadbfc70d | |
Chad Dougherty | 8c88f769b6 | |
0lhi | de24536187 | |
Aaron Suggs | 1ac66f372b | |
liv | 701b4bef51 | |
Cyril MARPAUD | 045d86aa42 | |
Alex | 89069f78b1 | |
Sebastian Törnquist | fef8314d3d | |
liv | bec7be05f5 | |
allcontributors[bot] | d42ac49de4 | |
allcontributors[bot] | 1272d0b990 | |
liv | cf86e734f2 | |
Gleb Shevchenko | 238a496af5 | |
liv | a3670d267b | |
allcontributors[bot] | 65f05f0541 | |
allcontributors[bot] | 338c95f120 | |
liv | 2b9dc4424e | |
Anush | ef0b25c392 | |
liv | 6f0e5d13ed | |
allcontributors[bot] | 046a18cd16 | |
allcontributors[bot] | e1e67d0d41 | |
liv | 216d08d013 | |
Daan Wynen | bbdc5c6039 | |
liv | 149e0c8ac2 | |
magnusrodseth | 48ce9d2fd8 | |
liv | fc9fb536ca | |
liv | 4c7e561740 | |
allcontributors[bot] | bf0fa8ee64 | |
allcontributors[bot] | d3ed9ce2f6 | |
liv | f123cb2777 | |
liv | dc3bf2ea30 | |
allcontributors[bot] | f3773660b0 | |
allcontributors[bot] | 18843cf62e | |
liv | 7be4fd891d | |
liv | b66e2e9b95 | |
allcontributors[bot] | 2aad5360d4 | |
allcontributors[bot] | e8683274ff | |
liv | b3de1b77bf | |
liv | 957522a492 | |
liv | ac050fb7ce | |
allcontributors[bot] | 88a92b311c | |
allcontributors[bot] | acd2164c85 | |
liv | 890d6549de | |
Alexander Gill | 0b119339eb | |
Alexander Gill | 4bdd3c036b | |
liv | 0ea42f60bd | |
allcontributors[bot] | 72fff8d51a | |
allcontributors[bot] | ff44be9dcd | |
liv | 23c3620001 | |
wjwrh | 1721ddc231 | |
liv | ce7ffcd8e9 | |
allcontributors[bot] | c952604308 | |
allcontributors[bot] | a1b2964869 | |
liv | 5faa0badef | |
Kevin Wan | 4771a7b9e7 | |
liv | 259b434f20 | |
allcontributors[bot] | d58c97bd21 | |
allcontributors[bot] | d05a817f3b | |
liv | 2b30cec974 | |
liv | 6ef284bb1a | |
allcontributors[bot] | ac839c267b | |
allcontributors[bot] | 3ed1e16c78 | |
liv | c28c661deb | |
h4x5p4c3 | 6b04848d41 | |
liv | c5898ac6b7 | |
Tobias Klauser | 7c4a3a2af6 | |
liv | 0d30dce26d | |
allcontributors[bot] | 6c170c2c21 | |
allcontributors[bot] | 4179317f37 | |
liv | 5bcd2cee1d | |
liv | 29ecee8cc6 | |
allcontributors[bot] | f67a2b2535 | |
allcontributors[bot] | 33e0c73df7 | |
liv | c28c0eb818 | |
0xMySt1c | 8722172049 | |
TenzinRabgy | 8e36256eac | |
himanshu soni | 951826e6b5 | |
Jarrod Sanders | 57834e9f8c | |
liv | 915a59e514 | |
allcontributors[bot] | b985b1d6ea | |
allcontributors[bot] | ceb03cfb2c | |
liv | b8d4bb1f13 | |
Tobias Klauser | 1b9d4bbf72 | |
liv | c6842938c9 | |
allcontributors[bot] | 2be582fb27 | |
allcontributors[bot] | 7ed0474364 | |
liv | 142633533e | |
David Barroso | e6bc13ff04 | |
liv | 49bbeeefae | |
allcontributors[bot] | cb5371f86f | |
allcontributors[bot] | 3001f1ae02 | |
liv | 7e98f67df8 | |
seporterfield | a5429d59f9 | |
seporterfield | 9860976af9 | |
seporterfield | b2b6e6900f | |
seporterfield | 66eaaf7b6e | |
seporterfield | 3fad2a9c83 | |
seporterfield | 8405a61b07 | |
seporterfield | e3e298cfa2 | |
seporterfield | 0f02a9b9af | |
seporterfield | 5b0d587c22 | |
seporterfield | e9dc52c2d3 | |
seporterfield | a0c5a892d3 | |
seporterfield | a8fd315e09 | |
seporterfield | e8c4aab643 | |
seporterfield | c3bab88fda | |
seporterfield | cf1ae884a1 | |
seporterfield | 05592acf40 | |
seporterfield | cb79be921d | |
liv | 6cee997266 | |
allcontributors[bot] | 6367697d92 | |
allcontributors[bot] | 25fc7814cc | |
liv | 69e8a35fd1 | |
HerschelW | 2f821aa30d | |
liv | f9f07bee09 | |
platformer | 7e4ce38681 | |
Petr Pucil | 4303717951 | |
liv | 32b234c9f0 | |
liv | 9ad884aadb | |
liv | 40b1b07915 | |
liv | 31469560ec | |
allcontributors[bot] | 5e583770f7 | |
allcontributors[bot] | 130e57ec60 | |
liv | 4ede64b729 | |
liv | 4521aed23b | |
liv | 4c3a00b5cd | |
liv | e0eef0e190 | |
William Webb | e519b5079e | |
David Barroso | b2df015fe6 | |
David Barroso | 1ce671528e | |
David Barroso | 3d693634b5 | |
Tyson Liddell | 71873e676f | |
Emmanuel Roullit | b653d4848a | |
Emmanuel Roullit | 4972bede48 | |
Emmanuel Roullit | f94f365e14 | |
TK Buristrakul | db53dbc126 | |
TK Buristrakul | a315f2fefb | |
TK Buristrakul | be0b7e084e | |
liv | e3af483fa6 | |
allcontributors[bot] | a8033e0193 | |
allcontributors[bot] | e8ef4fe5d6 | |
liv | cea60a2eb9 | |
craymel | 2ceb59a11d | |
liv | 97e3c419aa | |
allcontributors[bot] | 28d78e288b | |
allcontributors[bot] | 43c049df75 | |
liv | 0c05318237 | |
allcontributors[bot] | 78e2685d5f | |
allcontributors[bot] | ef3ef82057 | |
liv | d3f81b6e40 | |
mokou | 2e1630c712 | |
liv | 4a60b7b2e3 | |
allcontributors[bot] | 70f9f08d2c | |
allcontributors[bot] | 6413f5b5d4 | |
liv | 82b79aac2f | |
mfurak | 152193b459 | |
mfurak | d01ce8304e | |
liv | 8b0507cac8 | |
allcontributors[bot] | a0b10af1a3 | |
allcontributors[bot] | a2134d70c6 | |
liv | 7380e43f28 | |
liv | 24da5b358f | |
Moritz Böhme | 8e0f5bf125 | |
Tom Kunc | da995b24eb | |
Arkid | 623161e50d | |
liv | b17295b36f | |
allcontributors[bot] | ee84131171 | |
allcontributors[bot] | a204524897 | |
liv | 49a101b189 | |
liv | 53b8715ae3 | |
allcontributors[bot] | 61c086b242 | |
allcontributors[bot] | 5e6207bb90 | |
liv | 572dd2e9f3 | |
Matthew Van Schellebeeck | ccd73c0a81 | |
liv | b3322e36ae | |
allcontributors[bot] | 3cb9825033 | |
allcontributors[bot] | eea039b025 | |
liv | 587e2d6dcd | |
liv | 94831a0d54 | |
allcontributors[bot] | 8b251a202f | |
allcontributors[bot] | c96fbc7180 | |
liv | 22467b483b | |
azzamsa | 68388e5d4f | |
Yuri Astrakhan | 2940ad059d | |
liv | 56a4f1680d | |
allcontributors[bot] | a50dcc9728 | |
allcontributors[bot] | 08df6224af | |
liv | 6e42eede54 | |
bhbuehler | c157c53983 | |
Grzegorz Żur | da6178bdc6 | |
liv | 818eaa7307 | |
allcontributors[bot] | d00f7783db | |
allcontributors[bot] | bfdc1991a5 | |
liv | 4600bc344c | |
liv | dc14626ae1 | |
allcontributors[bot] | 88a767f39a | |
allcontributors[bot] | 1e1b689775 | |
liv | 896b9cea2a | |
Duchoud Nicolas | 76392d81fa | |
Duchoud Nicolas | 4749768734 | |
Gaëtan Faugère | b4c7507b4d | |
liv | cade600c91 | |
liv | 069e55c5ee | |
allcontributors[bot] | a59e305665 | |
allcontributors[bot] | 58cba835f2 | |
liv | 6174b5caf0 | |
liv | 2e33d422a5 | |
Tostapunk | 1660f1647e | |
Cal Jacobson | efdebd48b6 | |
skaunov | c0b3194a55 | |
liv | 2398f378b0 | |
allcontributors[bot] | 37a7344219 | |
allcontributors[bot] | 3375b67b2b | |
liv | 56b52115d9 | |
skaunov | 3028d1395c | |
liv | b85b8de232 | |
allcontributors[bot] | 072847943a | |
allcontributors[bot] | d3c0c18946 | |
liv | 4190b73f70 | |
Tiago De Gaspari | 68fe97bbc2 | |
Arkid | 34ed235885 | |
mokou | c923e7af73 | |
liv | c838d446ad | |
allcontributors[bot] | 50323a3977 | |
allcontributors[bot] | 7b5ef323c5 | |
liv | 199150fda2 | |
liv | c1b5a0511f | |
allcontributors[bot] | 742200d14b | |
allcontributors[bot] | 900d58d054 | |
liv | 6af86bbf22 | |
liv | 4c1070faab | |
allcontributors[bot] | f437f8e9ea | |
allcontributors[bot] | c9c743967f | |
liv | 88c9a23884 | |
liv | 1d5700e58a | |
liv | 96552e07c2 | |
Miguel Raz Guzmán Macedo | c97e659d78 | |
Magnus Markling | 291da61fda | |
Magnus Markling | 94bdb708fe | |
mokou | 3309a01b5e | |
liv | 5a03e46d69 | |
allcontributors[bot] | bf95a34553 | |
allcontributors[bot] | 33e501981a | |
liv | 4ee9a0f6b9 | |
Kody Low | d6e26bb350 | |
liv | f6a37e28ba | |
liv | a2f66e6a67 | |
allcontributors[bot] | b92e7b968f | |
allcontributors[bot] | 6c2630afcf | |
Gabriel Bianconi | 86506fa5fd | |
liv | 96098d228a | |
magnusrodseth | d59dde320b | |
liv | fb7d3bf35d | |
allcontributors[bot] | 50272a58e2 | |
allcontributors[bot] | 93f60d3f8d | |
liv | 97bf2469b6 | |
allcontributors[bot] | 2088dfbaf6 | |
allcontributors[bot] | e889c5bb60 | |
liv | 44d609816b | |
magnusrodseth | 99ea2cbba7 | |
magnusrodseth | 0aff5340b5 | |
magnusrodseth | 6f44cb1dd2 | |
magnusrodseth | 52a29aa84b | |
mokou | d0c7b06eff | |
liv | 5f9dd129ea | |
allcontributors[bot] | 34392662a6 | |
allcontributors[bot] | 3c1fe226f0 | |
liv | 3ac002934d | |
vostok92 | 4455c22b9a | |
mokou | 714a8075cc | |
mokou | 0a9d34a25a | |
mokou | bb6b9e1704 | |
liv | 8a4ed70762 | |
liv | 1c3b003c7c | |
liv | 25ab52b8e7 | |
liv | cd0ee50dd7 | |
allcontributors[bot] | 2f2f141564 | |
allcontributors[bot] | 4400ce2892 | |
liv | cc1b22d45f | |
Nico Vromans | e8122daa87 | |
liv | 8dfffe8aa2 | |
allcontributors[bot] | f107e2f31d | |
allcontributors[bot] | cf813b707c | |
liv | 2b0c73c7e4 | |
Markus Boehme | 3c84cc1702 | |
liv | 57377e8bf7 | |
allcontributors[bot] | a16e7b918a | |
allcontributors[bot] | 7e1a4c0363 | |
liv | cfbce9d225 | |
allcontributors[bot] | c1c4f86317 | |
allcontributors[bot] | dcf4efe628 | |
liv | 26b347a8bd | |
liv | 3c85fc4d39 | |
liv | a7ca40d8a3 | |
allcontributors[bot] | 8d9df94b6c | |
allcontributors[bot] | bf84fe029f | |
liv | ca96e32ff7 | |
Mouwrice | ef70ad907f | |
Brian Fakhoury | f25f77e915 | |
John Mendelewski III | a0a06232ce | |
liv | 300cdc27dd | |
allcontributors[bot] | 7a7281764c | |
allcontributors[bot] | d27c12e35d | |
liv | cbf9016187 | |
liv | 6ac42c5141 | |
allcontributors[bot] | 6289238d1d | |
allcontributors[bot] | e3b65186fd | |
liv | affc815447 | |
mokou | af301a2efe | |
liv | 977a167335 | |
allcontributors[bot] | 08f42761f9 | |
allcontributors[bot] | a04d62372f | |
liv | 5a8f2b62e3 | |
Lioness100 | c5ecc37a9a | |
Mikael Frosthage | 5ff23a2861 | |
Tristan Nicholls | a56f648cce | |
Claire Wang | a3a5fbeddf | |
liv | 3963559810 | |
allcontributors[bot] | 4bee3399f8 | |
allcontributors[bot] | 32687cc66e | |
liv | d21a8e63c1 | |
Denton24646 | 72e21a2a6c | |
Jeremy Goh | 301bc52857 | |
Jeremy Goh | f88c7d1e8c | |
liv | 3a327096c6 | |
allcontributors[bot] | 7a6079b46a | |
allcontributors[bot] | c1fc77e50f | |
liv | cbca27dffe | |
liv | 5cb40b2c95 | |
liv | e0fb7e72bb | |
allcontributors[bot] | e858fd94fb | |
allcontributors[bot] | 56c05f6232 | |
liv | 2663cc8e80 | |
Saikat Das | 2356b5c1b6 | |
Greg Leonard | e9f5c9423c | |
Edwin Chang | f34d390bba | |
liv | fb7dac75a7 | |
Greg Leonard | f9413b8ae1 | |
liv | fef10b8a0f | |
allcontributors[bot] | 82c41a61b6 | |
allcontributors[bot] | 3b74f5dae8 | |
liv | 316fc58b4c | |
Eric Jolibois | 8a4dca5fa6 | |
rzrymiak | 4910bae10f | |
liv | 0e7de2e7a7 | |
Mattia Schiavon | e1d6abb4c9 | |
Tostapunk | 02d78c3e84 | |
liv | 727fc3037c | |
allcontributors[bot] | 1aecf32748 | |
allcontributors[bot] | 2f113b9b06 | |
liv | d46a97ef97 | |
Tostapunk | 7035d6787c | |
Denton24646 | ce86d252e5 | |
liv | 8a0c6cfcfa | |
wojexe | b0e070c743 | |
liv | ab291a1fcd | |
allcontributors[bot] | 3bb008ebbb | |
allcontributors[bot] | e8cf9b2628 | |
liv | 179202a34a | |
wojexe | 55900c65cb | |
mokou | 5435b80841 | |
mokou | 5138f22e00 | |
mokou | cc3e1a8511 | |
mokou | c791cf4232 | |
liv | f1c4caa37f | |
allcontributors[bot] | e36c95bb3a | |
allcontributors[bot] | bc25309763 | |
Neil Pate | c265b681b1 | |
liv | 52b9f199a2 | |
allcontributors[bot] | 211528c31b | |
allcontributors[bot] | 2b349e3b28 | |
mokou | 1a7a3f5c8e | |
Sam White | 63b0c7e399 | |
Sam White | 599d634ee2 | |
Sam White | f43c6d7877 | |
Rod Elias | 9b66b2a0e9 | |
liv | 64757698f4 | |
allcontributors[bot] | 2427184017 | |
allcontributors[bot] | 75ba60bda6 | |
jayber | 1ef8dacaf6 | |
liv | 7cabbab580 | |
allcontributors[bot] | 9329c51df0 | |
allcontributors[bot] | bda4d548b4 | |
James Zow | 1cc5df0e14 | |
liv | a0b3156347 | |
allcontributors[bot] | c9332062ce | |
allcontributors[bot] | b71429bef0 | |
exdx | a3b5278b42 | |
mokou | a3c4c1ccb4 | |
mokou | a6e86fc995 | |
mokou | 0784f54141 | |
mokou | b609f0431c | |
mokou | 4bebdb5f02 | |
mokou | 81d25aecff | |
mokou | 74f44f55e3 | |
mokou | 8cfedb1673 | |
mokou | 7fc393bed4 | |
mokou | d3a335bc64 | |
liv | 636c8ac03d | |
allcontributors[bot] | b1f82890c9 | |
allcontributors[bot] | 7b371afc06 | |
mokou | f99eafc56f | |
jaystile | b4f52cb937 | |
liv | aa472f702e | |
allcontributors[bot] | 09ccadeec6 | |
allcontributors[bot] | 3e7e65b9f0 | |
mokou | 20024d40c5 | |
Paulo Gabriel Justino Bezerra | 251d0dda34 | |
Ryosuke YASUOKA | 3c63ef0668 | |
mokou | cf9629cb0e | |
mokou | 016d718a28 | |
mokou | 98b8d3f17d | |
mokou | 5979d408a9 | |
mokou | d61f79595a | |
liv | 69b07b2571 | |
allcontributors[bot] | 537abe273a | |
allcontributors[bot] | b2c82d9018 | |
liv | 9f44550cdc | |
allcontributors[bot] | 34c8833d06 | |
allcontributors[bot] | 5d02f6e516 | |
mokou | c34e2adcbb | |
Noah Cairns | 5e1ca4b995 | |
Steven nguyen | 582320aded | |
mokou | b71feed824 | |
mokou | 06e4fd3765 | |
mokou | b644558c19 | |
mokou | 472d7944f9 | |
mokou | c64b340622 | |
mokou | f443f4e7b3 | |
mokou | ab8572e15b | |
Sateesh Basavaraju | 1e54bc61e8 | |
mokou | fe54d0f85b | |
mokou | c1ed6b10fe | |
mokou | f5e4c16eed | |
liv | 2f69f21f39 | |
allcontributors[bot] | c92de1f8a6 | |
allcontributors[bot] | 0ddb997076 | |
mokou | c6bc97adc1 | |
Ryosuke YASUOKA | d0e8efd19e | |
liv | ed6d541d66 | |
allcontributors[bot] | 62578269eb | |
allcontributors[bot] | 8fe02d33a9 | |
mokou | 886d599c96 | |
camperdue42 | 4531c21bf1 | |
mokou | 4dffa0d10d | |
mokou | 19bec50399 | |
mokou | 2e62505143 | |
exdx | 16ff57bbff | |
mokou | bb0cf92b8b | |
mokou | 7452d0d603 | |
mokou | 3c4c9c54c9 | |
mokou | 2f7fd51304 | |
mokou | 8e1f617d34 | |
mokou | 7af12ba9aa | |
mokou | 6020ec1fe2 | |
Adam Sherwood | 5812f1f27b | |
mokou | 4868d18ea3 | |
mokou | 742fb08e01 | |
mokou | 093a525450 | |
Cooper Gillan | b3ec8fe022 | |
Cooper Gillan | 9688609d08 | |
gavin | 60410cfd2e | |
mokou | 81edc4234f | |
mokou | c3c21ad91f | |
mokou | 9ed4b0683e | |
mokou | 0ded8a90c0 | |
mokou | 0aee54a82b | |
mokou | ed0f278a8f | |
liv | bf69145bb9 | |
allcontributors[bot] | 1caa388e92 | |
allcontributors[bot] | 11618b65c0 | |
liv | a475e09cfc | |
liv | fba79ea793 | |
allcontributors[bot] | 440138af84 | |
allcontributors[bot] | 8835034bd2 | |
liv | 5fbf28dfec | |
liv | 2a12df4591 | |
allcontributors[bot] | 995ba213e2 | |
allcontributors[bot] | f73aec1a63 | |
liv | 08e3cf494b | |
liv | 36c43cb839 | |
allcontributors[bot] | c9e0d53ed2 | |
allcontributors[bot] | c38d75481e | |
liv | 612ae8b8f7 | |
Drew Morris | df68d1a86e | |
KatanaFluorescent | a500ed2c3c | |
mokou | 6588d9be22 | |
0pling | be3944072c | |
liv | d27f5a7d41 | |
allcontributors[bot] | e48f634f34 | |
allcontributors[bot] | 23403546d2 | |
liv | 294ef8d92c | |
Jack Clayton | be87cc9fa6 | |
Konstantin | baca5d62ae | |
diannasoreil | b19f74e8cf | |
dependabot[bot] | 5130a57f8f | |
diannasoreil | dc6376788b | |
allcontributors[bot] | ffb6ecaf7e | |
allcontributors[bot] | 34a3c440d0 | |
diannasoreil | 386257a06e | |
Jesse van Papenrecht | 0bdb5207b5 | |
diannasoreil | 5615dd9e7d | |
allcontributors[bot] | 439a07445e | |
allcontributors[bot] | fedabf5f7f | |
diannasoreil | fdc3eb3b4e | |
Lucas Grigolon Varela | b0e079e6bf | |
diannasoreil | 06cc363a46 | |
allcontributors[bot] | 47afcdcc6b | |
allcontributors[bot] | c17177bdef | |
diannasoreil | 8972e8f598 | |
pwygab | 5b94016585 | |
diannasoreil | 75b09dd69a | |
allcontributors[bot] | 89efbdf02d | |
allcontributors[bot] | b8ff299399 | |
diannasoreil | b4510fc03b | |
Nandaja Varma | 769483640c | |
diannasoreil | aaccd6f7f3 | |
likzn | 7027320a8f | |
diannasoreil | b759ef6b58 | |
allcontributors[bot] | a18f3b8158 | |
allcontributors[bot] | 144e1ef018 | |
mokou | 659a99032e | |
diannasoreil | c5de2d686d | |
Bryan Lee | 13832d7726 | |
diannasoreil | b7cce5c050 | |
allcontributors[bot] | 7a41bbca67 | |
allcontributors[bot] | 9e98b78260 | |
diannasoreil | 604166f549 | |
diannasoreil | 96b301c04e | |
allcontributors[bot] | 190bb27d78 | |
allcontributors[bot] | 7eb66550c9 | |
diannasoreil | 8f99209ab2 | |
cuishuang | 701dd9c700 | |
Ron Lusk | b821ffdd33 | |
diannasoreil | 102a4b92a0 | |
allcontributors[bot] | 283a4691aa | |
allcontributors[bot] | 8dc696883e | |
diannasoreil | a6f50fd6f3 | |
Ryan Lowe | 6fae5d6114 | |
mokou | d2179d3e84 | |
mokou | 9ec35d899c | |
mokou | c811643d1e | |
mokou | a259704570 | |
mokou | 268822dbd8 | |
diannasoreil | 1237aa574c | |
diannasoreil | b3734ba310 | |
allcontributors[bot] | c9b73e412e | |
allcontributors[bot] | 107f1f97d9 | |
diannasoreil | 420729da60 | |
fointard | 452ab26aa7 | |
fointard | 92a5d0037f | |
mokou | 0b7f3fe37a | |
mokou | cf9f382873 | |
mokou | 8f33dba9ca | |
mokou | 6c87dc8210 | |
diannasoreil | 6c071d4701 | |
allcontributors[bot] | 03ba8836f2 | |
allcontributors[bot] | 4bb94e050b | |
diannasoreil | 51817820f2 | |
mokou | 76a36dd385 | |
diannasoreil | c39eb3fe55 | |
allcontributors[bot] | 7dcc1fca29 | |
allcontributors[bot] | 887b6e183b | |
stevenfukase | 60bb7cc393 | |
J-S-Kim | 43d0623086 | |
diannasoreil | e6c0d00637 | |
allcontributors[bot] | b1cdce6289 | |
allcontributors[bot] | d3c5058d89 | |
ragreenburg | 89650f808a | |
diannasoreil | 0a92262fa0 | |
diannasoreil | 4e2a354716 | |
diannasoreil | 74895df5a7 | |
Pascal Havé | d114847f25 | |
Pascal Havé | 4dfd85ff05 | |
Soroush Zare | 0bd7a0631a | |
mokou | bdf6efeccd | |
diannasoreil | 331cdef7e3 | |
allcontributors[bot] | d4e3d98d0a | |
allcontributors[bot] | 2ca5250f78 | |
Lucas Aries | 3f0e1303e0 | |
diannasoreil | c80ad089fd | |
mokou | 01023f5b4f | |
allcontributors[bot] | 70e29d9717 | |
allcontributors[bot] | c60bd97cb9 | |
diannasoreil | d00f0d8c57 | |
mokou | bf93724511 | |
mokou | 057d912e78 | |
diannasoreil | e306e23963 | |
allcontributors[bot] | 0232f6058f | |
allcontributors[bot] | 4378d1db46 | |
x-hgg-x | 179a75a68d | |
Kisaragi | 17f9d7429c | |
Ryan Lowe | 9be012dda0 | |
apogeeoak | c1f35e46df | |
diannasoreil | cd2b5e8e3b | |
allcontributors[bot] | dc36ca6d84 | |
allcontributors[bot] | e96112ab99 | |
Brandon High | bc56861744 | |
diannasoreil | 4cde788d33 | |
diannasoreil | 9838892cf3 | |
diannasoreil | 9c5d8ad44c | |
allcontributors[bot] | a2e74a2a4b | |
allcontributors[bot] | 52c7f8a859 | |
Yang Wen | 4f7ff5d9c7 | |
zydxhs | cbcde34540 | |
radicale | 71a06044e6 | |
diannasoreil | 5002c54ffb | |
allcontributors[bot] | 17e3e75331 | |
allcontributors[bot] | af84359bdb | |
diannasoreil | 74739261d6 | |
ZX | 1622e8c198 | |
diannasoreil | e06ba1df58 | |
allcontributors[bot] | 7dce8c8b61 | |
allcontributors[bot] | f61f9f3796 | |
diannasoreil | 6516a89485 | |
Galih wisnuaji | 9b27e8d993 | |
diannasoreil | f7719a4a9c | |
allcontributors[bot] | 81fb396780 | |
allcontributors[bot] | 8d675198d8 | |
diannasoreil | 969384c258 | |
Franklin van Nes | f2650de369 | |
diannasoreil | acaee79994 | |
allcontributors[bot] | 527a5b1182 | |
allcontributors[bot] | 72b2c9f54f | |
alirezaghey | 8ef4869b26 | |
diannasoreil | dba759e1c6 | |
allcontributors[bot] | cb661896a2 | |
allcontributors[bot] | e08b6cf3ef | |
diannasoreil | e2fa512e86 | |
Michael Walsh | d1ee2daf14 | |
ana | 359f81dd0b | |
diannasoriel | 5e5271247a | |
allcontributors[bot] | 71da9068e7 | |
allcontributors[bot] | b24b295d88 | |
xuesong | 1663a16ead | |
diannasoriel | af91eb508a | |
rlch | 1c0fe3cbcc | |
diannasoriel | ed7fe883b9 | |
allcontributors[bot] | ae54c17b6a | |
allcontributors[bot] | 574bbffe0b | |
Fredrik Enestad | 46c28d5cef | |
diannasoriel | ad338ee789 | |
allcontributors[bot] | e3cfaa246d | |
allcontributors[bot] | fed4fe78bb | |
Zhenghao Lu | bf33829da2 | |
ana | d57c183028 | |
diannasoriel | c2ed98deb3 | |
Taylor Yu | abd6b70c72 | |
Taylor Yu | 882d535ba8 | |
diannasoriel | 0de45ccdb7 | |
allcontributors[bot] | ab5ecbee7a | |
allcontributors[bot] | e106d7a4f4 | |
frogtd | d75759e829 | |
diannasoriel | db9d7a907d | |
allcontributors[bot] | a1b9c50f36 | |
allcontributors[bot] | c4b59aa593 | |
diannasoriel | 4a18bdeefe | |
Antoine Busch | 1caef0b434 | |
diannasoriel | ae56cba9c8 | |
ana | 3352b5a4d3 | |
diannasoriel | 24762434ff | |
allcontributors[bot] | e9c0ca6be2 | |
allcontributors[bot] | 9ef63c0b9b | |
LIU JIE | 06d5c0973a | |
diannasoriel | 8d82856233 | |
allcontributors[bot] | 9ddd4ca33a | |
allcontributors[bot] | fe726f5bca | |
Weilet | 0a11bad714 | |
ana | a7dc080b95 | |
diannasoriel | 74af578beb | |
joakim.kartveit | 6efa7d5d15 | |
diannasoriel | a6774100d4 | |
allcontributors[bot] | de22b13273 | |
allcontributors[bot] | 6c41adef63 | |
granddaifuku | 1c3beb0a59 | |
diannasoriel | e4e9e4c963 | |
allcontributors[bot] | 44d8047249 | |
allcontributors[bot] | 5423f1be29 | |
anuk909 | dfd2fab4f3 | |
diannasoriel | 96fc301764 | |
diannasoriel | 5bdb5de855 | |
allcontributors[bot] | a64dbdcc04 | |
allcontributors[bot] | 2f0ff258b1 | |
Ben Armstead | 1cd9328a58 | |
diannasoriel | ec527824b4 | |
allcontributors[bot] | 380587f120 | |
allcontributors[bot] | ba8f97f418 | |
Damian | 03131a3d35 | |
ana | df25684cb7 | |
fmoko | 8e313cffaa | |
fmoko | 6948905716 | |
ana | ba087ce64a | |
fmoko | 3b03865a62 | |
allcontributors[bot] | 33fa274bbf | |
allcontributors[bot] | 23f700dc23 | |
Rakshit Sinha | d876649616 | |
fmoko | e4c14ac76e | |
allcontributors[bot] | b438049c39 | |
allcontributors[bot] | b017579577 | |
fmoko | c8e4b357a3 | |
lauralindzey | 8774e47dc3 | |
Laura Lindzey | e422ab1507 | |
marisa | cdd8e19716 | |
allcontributors[bot] | 91d86a1de9 | |
allcontributors[bot] | 6a10f900b4 | |
marisa | 9b9a89c79a | |
marisa | 123e6426d1 | |
marisa | 427ec6b2e4 | |
allcontributors[bot] | 03dcb582e6 | |
allcontributors[bot] | 1043a06124 | |
Richthofen | d20e413a68 | |
arlecchino | 9bf4c5e8df | |
marisa | 633303d4b8 | |
arlecchino | a4a1098766 | |
marisa | 0bd459dcac | |
allcontributors[bot] | 3b4514b686 | |
allcontributors[bot] | 2e05606edc | |
marisa | c8c1b87a01 | |
arlecchino | 34ea029df8 | |
arlecchino | 3a4433d5a2 | |
Taylor Yu | 2dc93cadda | |
marisa | de6c45ad24 | |
allcontributors[bot] | fadade8592 | |
allcontributors[bot] | d91044f3a2 | |
marisa | a3ea37b76e | |
marisa | ec63cadadb | |
marisa | 84d8305730 | |
allcontributors[bot] | 73777980f1 | |
allcontributors[bot] | 75788b1148 | |
marisa | dd9b2ddc89 | |
Taylor Yu | b7ddd09fab | |
ZC | 48ffcbd2c4 | |
Taylor Yu | 68d3ac567c | |
Taylor Yu | 50ab289da6 | |
Taylor Yu | 4e079fdd08 | |
Taylor Yu | 91fc9e3118 | |
marisa | a2f0401c4c | |
Taylor Yu | 1b85828548 | |
Taylor Yu | 4c46e5e1a3 | |
marisa | 4da9e7ee29 | |
allcontributors[bot] | 72e615aa7a | |
allcontributors[bot] | cd02abc481 | |
Sateesh | 399ab328d8 | |
marisa | 809ec2ce01 | |
Taylor Yu | 11d2cf0d60 | |
marisa | dbb2624403 | |
Juan Pablo Ramirez | 4d4fa77459 | |
Juan Pablo Ramirez | 3145794084 | |
Juan Pablo Ramirez | d9b69bd1a0 | |
marisa | 7cd635fa84 | |
allcontributors[bot] | ce40e201f0 | |
allcontributors[bot] | 404f3ef465 | |
marisa | e1be594fdd | |
Pi Delport | 9569c9a9e7 | |
apogeeoak | f78c480208 | |
Martin HART | 8794b40bc6 | |
Martin HART | 86cc85295a | |
Martin HART | 166a53946c | |
marisa | 91530f5716 | |
apogeeoak | 9b8de65525 | |
Maarten Tibau | 650b1dee54 | |
apogeeoak | 21c9f44168 | |
apogeeoak | 7f0d2c2bf0 | |
marisa | 6b6dc9dd48 | |
allcontributors[bot] | 3a9ec4192d | |
allcontributors[bot] | 4f7dbbd2c3 | |
marisa | 8c37db1a23 | |
Dan Stoian | c6b7ad8878 | |
Zerotask | 4a384cae4a | |
mokou | 84461c20cb | |
marisa | 3cddda56fc | |
marisa | 37f3069a67 | |
marisa | 2b2fbe918e | |
Zerotask | cf42ddc449 | |
Zerotask | eefa656232 | |
Zerotask | 249ad44cc0 | |
marisa | 54804e344d | |
marisa | 1c334de6fd | |
Zerotask | f253103a31 | |
Zerotask | 1120db57a6 | |
marisa | afa661cff4 | |
mokou | 347f30bd86 | |
marisa | 127773f3f5 | |
allcontributors[bot] | 8d0490bd70 | |
allcontributors[bot] | 293dfb35d5 | |
Brandon Macer | 81be404487 | |
mokou | 6177b6e126 | |
marisa | 79cc657917 | |
mokou | 7928122fce | |
apogeeoak | 9c88ea9126 | |
marisa | 2b766ef9f9 | |
marisa | bd3d9ac9d5 | |
marisa | aa0db8379c | |
allcontributors[bot] | eadd41a9ec | |
allcontributors[bot] | fab2eb9833 | |
Shao Yang Hong | 6bd791f2f4 | |
marisa | ec5f80dce1 | |
allcontributors[bot] | 65cdc856ae | |
allcontributors[bot] | 472f61485e | |
k12ish | b4de659438 | |
marisa | a37a8818c8 | |
allcontributors[bot] | bdf01aa174 | |
allcontributors[bot] | a941c69f09 | |
Pete Pavlovski | 72aaa15e6a | |
marisa | 3a06de71a8 | |
marisa | 5e2b39a5c1 | |
allcontributors[bot] | 63c942233e | |
allcontributors[bot] | 2612edc133 | |
marisa | e2ce9f42b5 | |
Patrick Hintermayer | 1c6f7e4b7b | |
Zerotask | e2c41903ad | |
Zerotask | bd48544e25 | |
Zerotask | c0e3daacaf | |
Abdou Seck | f2ad3a6a0b | |
Abdou Seck | caf921a01f | |
WowSuchRicky | b790bafc02 | |
Abdou Seck | ad3cd54cce | |
allcontributors[bot] | 1a6a725f88 | |
allcontributors[bot] | 1ad20d94ff | |
Abdou Seck | 995c6f0fb1 | |
Taylor Yu | c3e7b83178 | |
Taylor Yu | 2e93a588e0 | |
marisa | 9aeca3f97e | |
allcontributors[bot] | 2193fff4bb | |
allcontributors[bot] | aec2c65c63 | |
Ignacio Le Fluk | a6509cc4d5 | |
marisa | a02b279750 | |
marisa | ece841f5ce | |
Mickael Fortunato | ab9995e76e | |
Mickael Fortunato | bef39b1259 | |
Ivan Nerazumov | aa9a943ddf | |
apogeeoak | c6712dfccd | |
apogeeoak | baf4ba175b | |
apogeeoak | b29ea17ea9 |
1665
.all-contributorsrc
1665
.all-contributorsrc
File diff suppressed because it is too large
Load Diff
|
@ -1,4 +0,0 @@
|
||||||
[clog]
|
|
||||||
|
|
||||||
repository = "https://github.com/rust-lang/rustlings"
|
|
||||||
changelog = "CHANGELOG.md"
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"image": "mcr.microsoft.com/devcontainers/universal:2-linux",
|
||||||
|
"waitFor": "onCreateCommand",
|
||||||
|
"onCreateCommand": ".devcontainer/setup.sh",
|
||||||
|
"updateContentCommand": "cargo build",
|
||||||
|
"postCreateCommand": "",
|
||||||
|
"postAttachCommand": {
|
||||||
|
"server": "rustlings watch"
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": [
|
||||||
|
"rust-lang.rust-analyzer"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
curl https://sh.rustup.rs -sSf | sh -s -- -y
|
||||||
|
|
||||||
|
# Update current shell environment variables after install to find rustup
|
||||||
|
. "$HOME/.cargo/env"
|
||||||
|
rustup install stable
|
||||||
|
bash install.sh
|
|
@ -2,6 +2,6 @@ root = true
|
||||||
|
|
||||||
[*.rs]
|
[*.rs]
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
insert_final_newfile = true
|
insert_final_newline = true
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Automatically Load nix devShell w/dotenv
|
||||||
|
use flake
|
|
@ -0,0 +1,37 @@
|
||||||
|
name: Rustlings Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main ]
|
||||||
|
|
||||||
|
env:
|
||||||
|
CARGO_TERM_COLOR: always
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
fmt:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
components: rustfmt
|
||||||
|
- uses: DavidAnson/markdownlint-cli2-action@v9
|
||||||
|
with:
|
||||||
|
globs: "exercises/**/*.md"
|
||||||
|
- name: Run cargo fmt
|
||||||
|
run: |
|
||||||
|
cargo fmt --all -- --check
|
||||||
|
test:
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, windows-latest, macOS-latest]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
|
- uses: swatinem/rust-cache@v2
|
||||||
|
- name: Run cargo test
|
||||||
|
run: |
|
||||||
|
cargo test
|
|
@ -0,0 +1,88 @@
|
||||||
|
# Workflow to build your docs with oranda (and mdbook)
|
||||||
|
# and deploy them to Github Pages
|
||||||
|
name: Web
|
||||||
|
|
||||||
|
# We're going to push to the gh-pages branch, so we need that permission
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
# What situations do we want to build docs in?
|
||||||
|
# All of these work independently and can be removed / commented out
|
||||||
|
# if you don't want oranda/mdbook running in that situation
|
||||||
|
on:
|
||||||
|
# Check that a PR didn't break docs!
|
||||||
|
#
|
||||||
|
# Note that the "Deploy to Github Pages" step won't run in this mode,
|
||||||
|
# so this won't have any side-effects. But it will tell you if a PR
|
||||||
|
# completely broke oranda/mdbook. Sadly we don't provide previews (yet)!
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
# Whenever something gets pushed to main, update the docs!
|
||||||
|
# This is great for getting docs changes live without cutting a full release.
|
||||||
|
#
|
||||||
|
# Note that if you're using cargo-dist, this will "race" the Release workflow
|
||||||
|
# that actually builds the Github Release that oranda tries to read (and
|
||||||
|
# this will almost certainly complete first). As a result you will publish
|
||||||
|
# docs for the latest commit but the oranda landing page won't know about
|
||||||
|
# the latest release. The workflow_run trigger below will properly wait for
|
||||||
|
# cargo-dist, and so this half-published state will only last for ~10 minutes.
|
||||||
|
#
|
||||||
|
# If you only want docs to update with releases, disable this, or change it to
|
||||||
|
# a "release" branch. You can, of course, also manually trigger a workflow run
|
||||||
|
# when you want the docs to update.
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
# Whenever a workflow called "Release" completes, update the docs!
|
||||||
|
#
|
||||||
|
# If you're using cargo-dist, this is recommended, as it will ensure that
|
||||||
|
# oranda always sees the latest release right when it's available. Note
|
||||||
|
# however that Github's UI is wonky when you use workflow_run, and won't
|
||||||
|
# show this workflow as part of any commit. You have to go to the "actions"
|
||||||
|
# tab for your repo to see this one running (the gh-pages deploy will also
|
||||||
|
# only show up there).
|
||||||
|
workflow_run:
|
||||||
|
workflows: [ "Release" ]
|
||||||
|
types:
|
||||||
|
- completed
|
||||||
|
|
||||||
|
# Alright, let's do it!
|
||||||
|
jobs:
|
||||||
|
web:
|
||||||
|
name: Build and deploy site and docs
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
# Setup
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
|
- uses: swatinem/rust-cache@v2
|
||||||
|
|
||||||
|
# If you use any mdbook plugins, here's the place to install them!
|
||||||
|
|
||||||
|
# Install and run oranda (and mdbook)
|
||||||
|
# This will write all output to ./public/ (including copying mdbook's output to there)
|
||||||
|
- name: Install and run oranda
|
||||||
|
run: |
|
||||||
|
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/oranda/releases/download/v0.3.1/oranda-installer.sh | sh
|
||||||
|
oranda build
|
||||||
|
|
||||||
|
# Deploy to our gh-pages branch (creating it if it doesn't exist)
|
||||||
|
# the "public" dir that oranda made above will become the root dir
|
||||||
|
# of this branch.
|
||||||
|
#
|
||||||
|
# Note that once the gh-pages branch exists, you must
|
||||||
|
# go into repo's settings > pages and set "deploy from branch: gh-pages"
|
||||||
|
# the other defaults work fine.
|
||||||
|
- name: Deploy to Github Pages
|
||||||
|
uses: JamesIves/github-pages-deploy-action@v4.4.1
|
||||||
|
# ONLY if we're on main (so no PRs or feature branches allowed!)
|
||||||
|
if: ${{ github.ref == 'refs/heads/main' }}
|
||||||
|
with:
|
||||||
|
branch: gh-pages
|
||||||
|
# Gotta tell the action where to find oranda's output
|
||||||
|
folder: public
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
single-commit: true
|
|
@ -5,5 +5,14 @@ target/
|
||||||
*.pdb
|
*.pdb
|
||||||
exercises/clippy/Cargo.toml
|
exercises/clippy/Cargo.toml
|
||||||
exercises/clippy/Cargo.lock
|
exercises/clippy/Cargo.lock
|
||||||
|
rust-project.json
|
||||||
.idea
|
.idea
|
||||||
.vscode
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
*.iml
|
||||||
|
*.o
|
||||||
|
public/
|
||||||
|
.direnv/
|
||||||
|
|
||||||
|
# Local Netlify folder
|
||||||
|
.netlify
|
||||||
|
|
|
@ -4,4 +4,4 @@ tasks:
|
||||||
|
|
||||||
vscode:
|
vscode:
|
||||||
extensions:
|
extensions:
|
||||||
- rust-lang.rust@0.7.8:CvNqMTgDdt3UXt+6BCDTVg==
|
- rust-lang.rust-analyzer@0.3.1348
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
# MD013/line-length Line length, Expected: 80
|
||||||
|
MD013: false
|
2
.replit
2
.replit
|
@ -1,2 +0,0 @@
|
||||||
language = "rust"
|
|
||||||
run = "[ -x ~/.cargo/bin/rustlings ] && ~/.cargo/bin/rustlings watch || ./install.sh"
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"rust-lang.rust-analyzer"
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,356 @@
|
||||||
|
## Authors
|
||||||
|
|
||||||
|
This file lists the people that have contributed to this project.
|
||||||
|
|
||||||
|
Excluded from this list are @carols10cents and @diannasoreil, the principal
|
||||||
|
authors.
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
|
<!-- prettier-ignore-start -->
|
||||||
|
<!-- markdownlint-disable -->
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://carol-nichols.com"><img src="https://avatars2.githubusercontent.com/u/193874?v=4?s=100" width="100px;" alt="Carol (Nichols || Goulding)"/><br /><sub><b>Carol (Nichols || Goulding)</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=carols10cents" title="Code">💻</a> <a href="#content-carols10cents" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://twitter.com/QuietMisdreavus"><img src="https://avatars2.githubusercontent.com/u/5217170?v=4?s=100" width="100px;" alt="QuietMisdreavus"/><br /><sub><b>QuietMisdreavus</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=QuietMisdreavus" title="Code">💻</a> <a href="#content-QuietMisdreavus" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/robertlugg"><img src="https://avatars0.githubusercontent.com/u/6054540?v=4?s=100" width="100px;" alt="Robert M Lugg"/><br /><sub><b>Robert M Lugg</b></sub></a><br /><a href="#content-robertlugg" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://hynek.me/about/"><img src="https://avatars3.githubusercontent.com/u/41240?v=4?s=100" width="100px;" alt="Hynek Schlawack"/><br /><sub><b>Hynek Schlawack</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=hynek" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://spacekookie.de"><img src="https://avatars0.githubusercontent.com/u/7669898?v=4?s=100" width="100px;" alt="Katharina Fey"/><br /><sub><b>Katharina Fey</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=spacekookie" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lukabavdaz"><img src="https://avatars0.githubusercontent.com/u/9624558?v=4?s=100" width="100px;" alt="lukabavdaz"/><br /><sub><b>lukabavdaz</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=lukabavdaz" title="Code">💻</a> <a href="#content-lukabavdaz" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://vestera.as"><img src="https://avatars2.githubusercontent.com/u/4187449?v=4?s=100" width="100px;" alt="Erik Vesteraas"/><br /><sub><b>Erik Vesteraas</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=evestera" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Delet0r"><img src="https://avatars1.githubusercontent.com/u/23195618?v=4?s=100" width="100px;" alt="delet0r"/><br /><sub><b>delet0r</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Delet0r" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://phinary.ca"><img src="https://avatars1.githubusercontent.com/u/10522375?v=4?s=100" width="100px;" alt="Shaun Bennett"/><br /><sub><b>Shaun Bennett</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=shaunbennett" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/abagshaw"><img src="https://avatars2.githubusercontent.com/u/8594541?v=4?s=100" width="100px;" alt="Andrew Bagshaw"/><br /><sub><b>Andrew Bagshaw</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=abagshaw" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://ai6ua.net/"><img src="https://avatars2.githubusercontent.com/u/175578?v=4?s=100" width="100px;" alt="Kyle Isom"/><br /><sub><b>Kyle Isom</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=kisom" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ColinPitrat"><img src="https://avatars3.githubusercontent.com/u/1541863?v=4?s=100" width="100px;" alt="Colin Pitrat"/><br /><sub><b>Colin Pitrat</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=ColinPitrat" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://zacanger.com"><img src="https://avatars3.githubusercontent.com/u/12520493?v=4?s=100" width="100px;" alt="Zac Anger"/><br /><sub><b>Zac Anger</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=zacanger" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mgeier"><img src="https://avatars1.githubusercontent.com/u/705404?v=4?s=100" width="100px;" alt="Matthias Geier"/><br /><sub><b>Matthias Geier</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=mgeier" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cjpearce"><img src="https://avatars1.githubusercontent.com/u/3453268?v=4?s=100" width="100px;" alt="Chris Pearce"/><br /><sub><b>Chris Pearce</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=cjpearce" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://yvan-sraka.github.io"><img src="https://avatars2.githubusercontent.com/u/705213?v=4?s=100" width="100px;" alt="Yvan Sraka"/><br /><sub><b>Yvan Sraka</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=yvan-sraka" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/dendi239"><img src="https://avatars3.githubusercontent.com/u/16478650?v=4?s=100" width="100px;" alt="Denys Smirnov"/><br /><sub><b>Denys Smirnov</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=dendi239" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/eddyp"><img src="https://avatars2.githubusercontent.com/u/123772?v=4?s=100" width="100px;" alt="eddyp"/><br /><sub><b>eddyp</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=eddyp" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://about.me/BrianKung"><img src="https://avatars1.githubusercontent.com/u/2836167?v=4?s=100" width="100px;" alt="Brian Kung"/><br /><sub><b>Brian Kung</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=briankung" title="Code">💻</a> <a href="#content-briankung" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://rcousineau.gitlab.io"><img src="https://avatars3.githubusercontent.com/u/281039?v=4?s=100" width="100px;" alt="Russell"/><br /><sub><b>Russell</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=miller-time" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://danwilhelm.com"><img src="https://avatars3.githubusercontent.com/u/6137185?v=4?s=100" width="100px;" alt="Dan Wilhelm"/><br /><sub><b>Dan Wilhelm</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=danwilhelm" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Jesse-Cameron"><img src="https://avatars3.githubusercontent.com/u/3723654?v=4?s=100" width="100px;" alt="Jesse"/><br /><sub><b>Jesse</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Jesse-Cameron" title="Code">💻</a> <a href="#content-Jesse-Cameron" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MrFroop"><img src="https://avatars3.githubusercontent.com/u/196700?v=4?s=100" width="100px;" alt="Fredrik Jambrén"/><br /><sub><b>Fredrik Jambrén</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=MrFroop" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/petemcfarlane"><img src="https://avatars3.githubusercontent.com/u/3472717?v=4?s=100" width="100px;" alt="Pete McFarlane"/><br /><sub><b>Pete McFarlane</b></sub></a><br /><a href="#content-petemcfarlane" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nkanderson"><img src="https://avatars0.githubusercontent.com/u/4128825?v=4?s=100" width="100px;" alt="nkanderson"/><br /><sub><b>nkanderson</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nkanderson" title="Code">💻</a> <a href="#content-nkanderson" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ajaxm"><img src="https://avatars0.githubusercontent.com/u/13360138?v=4?s=100" width="100px;" alt="Ajax M"/><br /><sub><b>Ajax M</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=ajaxm" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://dylnuge.com"><img src="https://avatars2.githubusercontent.com/u/118624?v=4?s=100" width="100px;" alt="Dylan Nugent"/><br /><sub><b>Dylan Nugent</b></sub></a><br /><a href="#content-Dylnuge" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/vyaslav"><img src="https://avatars0.githubusercontent.com/u/1385427?v=4?s=100" width="100px;" alt="vyaslav"/><br /><sub><b>vyaslav</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=vyaslav" title="Code">💻</a> <a href="#content-vyaslav" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://join.sfxd.org"><img src="https://avatars1.githubusercontent.com/u/17297466?v=4?s=100" width="100px;" alt="George"/><br /><sub><b>George</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=gdoenlen" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nyxtom"><img src="https://avatars2.githubusercontent.com/u/222763?v=4?s=100" width="100px;" alt="Thomas Holloway"/><br /><sub><b>Thomas Holloway</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nyxtom" title="Code">💻</a> <a href="#content-nyxtom" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/workingjubilee"><img src="https://avatars1.githubusercontent.com/u/46493976?v=4?s=100" width="100px;" alt="Jubilee"/><br /><sub><b>Jubilee</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=workingjubilee" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/WofWca"><img src="https://avatars1.githubusercontent.com/u/39462442?v=4?s=100" width="100px;" alt="WofWca"/><br /><sub><b>WofWca</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=WofWca" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jrvidal"><img src="https://avatars0.githubusercontent.com/u/1636604?v=4?s=100" width="100px;" alt="Roberto Vidal"/><br /><sub><b>Roberto Vidal</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=jrvidal" title="Code">💻</a> <a href="https://github.com/rust-lang/rustlings/commits?author=jrvidal" title="Documentation">📖</a> <a href="#ideas-jrvidal" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-jrvidal" title="Maintenance">🚧</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jensim"><img src="https://avatars0.githubusercontent.com/u/3663856?v=4?s=100" width="100px;" alt="Jens"/><br /><sub><b>Jens</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=jensim" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://rahatah.me/d"><img src="https://avatars3.githubusercontent.com/u/3174006?v=4?s=100" width="100px;" alt="Rahat Ahmed"/><br /><sub><b>Rahat Ahmed</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=rahatarmanahmed" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/AbdouSeck"><img src="https://avatars2.githubusercontent.com/u/6490055?v=4?s=100" width="100px;" alt="Abdou Seck"/><br /><sub><b>Abdou Seck</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=AbdouSeck" title="Code">💻</a> <a href="#content-AbdouSeck" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/pulls?q=is%3Apr+reviewed-by%3AAbdouSeck" title="Reviewed Pull Requests">👀</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://codehearts.com"><img src="https://avatars0.githubusercontent.com/u/2885412?v=4?s=100" width="100px;" alt="Katie"/><br /><sub><b>Katie</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=codehearts" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Socratides"><img src="https://avatars3.githubusercontent.com/u/27732983?v=4?s=100" width="100px;" alt="Socrates"/><br /><sub><b>Socrates</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Socratides" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gnodarse"><img src="https://avatars3.githubusercontent.com/u/46761795?v=4?s=100" width="100px;" alt="gnodarse"/><br /><sub><b>gnodarse</b></sub></a><br /><a href="#content-gnodarse" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/harrisonmetz"><img src="https://avatars1.githubusercontent.com/u/7883408?v=4?s=100" width="100px;" alt="Harrison Metzger"/><br /><sub><b>Harrison Metzger</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=harrisonmetz" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/TorbenJ"><img src="https://avatars2.githubusercontent.com/u/9077102?v=4?s=100" width="100px;" alt="Torben Jonas"/><br /><sub><b>Torben Jonas</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=TorbenJ" title="Code">💻</a> <a href="#content-TorbenJ" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://paulbissex.com/"><img src="https://avatars0.githubusercontent.com/u/641?v=4?s=100" width="100px;" alt="Paul Bissex"/><br /><sub><b>Paul Bissex</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=pbx" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sjmann"><img src="https://avatars0.githubusercontent.com/u/6589896?v=4?s=100" width="100px;" alt="Steven Mann"/><br /><sub><b>Steven Mann</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=sjmann" title="Code">💻</a> <a href="#content-sjmann" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://smmdb.net/"><img src="https://avatars2.githubusercontent.com/u/5855071?v=4?s=100" width="100px;" alt="Mario Reder"/><br /><sub><b>Mario Reder</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Tarnadas" title="Code">💻</a> <a href="#content-Tarnadas" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://keybase.io/skim"><img src="https://avatars0.githubusercontent.com/u/47347?v=4?s=100" width="100px;" alt="skim"/><br /><sub><b>skim</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=sl4m" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sanjaykdragon"><img src="https://avatars1.githubusercontent.com/u/10261698?v=4?s=100" width="100px;" alt="Sanjay K"/><br /><sub><b>Sanjay K</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=sanjaykdragon" title="Code">💻</a> <a href="#content-sanjaykdragon" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://www.rohanjain.in"><img src="https://avatars1.githubusercontent.com/u/343499?v=4?s=100" width="100px;" alt="Rohan Jain"/><br /><sub><b>Rohan Jain</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=crodjer" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.saidaspen.se"><img src="https://avatars1.githubusercontent.com/u/7727687?v=4?s=100" width="100px;" alt="Said Aspen"/><br /><sub><b>Said Aspen</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=saidaspen" title="Code">💻</a> <a href="#content-saidaspen" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/uce"><img src="https://avatars3.githubusercontent.com/u/1756620?v=4?s=100" width="100px;" alt="Ufuk Celebi"/><br /><sub><b>Ufuk Celebi</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=uce" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lebedevsergey"><img src="https://avatars2.githubusercontent.com/u/7325764?v=4?s=100" width="100px;" alt="lebedevsergey"/><br /><sub><b>lebedevsergey</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=lebedevsergey" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/avrong"><img src="https://avatars2.githubusercontent.com/u/6342851?v=4?s=100" width="100px;" alt="Aleksei Trifonov"/><br /><sub><b>Aleksei Trifonov</b></sub></a><br /><a href="#content-avrong" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://drn.ie"><img src="https://avatars2.githubusercontent.com/u/411136?v=4?s=100" width="100px;" alt="Darren Meehan"/><br /><sub><b>Darren Meehan</b></sub></a><br /><a href="#content-Darrenmeehan" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jihchi"><img src="https://avatars1.githubusercontent.com/u/87983?v=4?s=100" width="100px;" alt="Jihchi Lee"/><br /><sub><b>Jihchi Lee</b></sub></a><br /><a href="#content-jihchi" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bertonha"><img src="https://avatars3.githubusercontent.com/u/1225902?v=4?s=100" width="100px;" alt="Christofer Bertonha"/><br /><sub><b>Christofer Bertonha</b></sub></a><br /><a href="#content-bertonha" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apatniv"><img src="https://avatars2.githubusercontent.com/u/22565917?v=4?s=100" width="100px;" alt="Vivek Bharath Akupatni"/><br /><sub><b>Vivek Bharath Akupatni</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=apatniv" title="Code">💻</a> <a href="https://github.com/rust-lang/rustlings/commits?author=apatniv" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/DiD92"><img src="https://avatars3.githubusercontent.com/u/6002416?v=4?s=100" width="100px;" alt="Dídac Sementé Fernández"/><br /><sub><b>Dídac Sementé Fernández</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=DiD92" title="Code">💻</a> <a href="#content-DiD92" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/wrobstory"><img src="https://avatars3.githubusercontent.com/u/2601457?v=4?s=100" width="100px;" alt="Rob Story"/><br /><sub><b>Rob Story</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=wrobstory" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/siobhanjacobson"><img src="https://avatars2.githubusercontent.com/u/28983835?v=4?s=100" width="100px;" alt="Siobhan Jacobson"/><br /><sub><b>Siobhan Jacobson</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=siobhanjacobson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/evancarroll/"><img src="https://avatars2.githubusercontent.com/u/19922?v=4?s=100" width="100px;" alt="Evan Carroll"/><br /><sub><b>Evan Carroll</b></sub></a><br /><a href="#content-EvanCarroll" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://www.jawaadmahmood.com"><img src="https://avatars3.githubusercontent.com/u/95606?v=4?s=100" width="100px;" alt="Jawaad Mahmood"/><br /><sub><b>Jawaad Mahmood</b></sub></a><br /><a href="#content-jmahmood" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/GaurangTandon"><img src="https://avatars1.githubusercontent.com/u/6308683?v=4?s=100" width="100px;" alt="Gaurang Tandon"/><br /><sub><b>Gaurang Tandon</b></sub></a><br /><a href="#content-GaurangTandon" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/dev-cyprium"><img src="https://avatars1.githubusercontent.com/u/6002628?v=4?s=100" width="100px;" alt="Stefan Kupresak"/><br /><sub><b>Stefan Kupresak</b></sub></a><br /><a href="#content-dev-cyprium" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/greg-el"><img src="https://avatars3.githubusercontent.com/u/45019882?v=4?s=100" width="100px;" alt="Greg Leonard"/><br /><sub><b>Greg Leonard</b></sub></a><br /><a href="#content-greg-el" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://ryanpcmcquen.org"><img src="https://avatars3.githubusercontent.com/u/772937?v=4?s=100" width="100px;" alt="Ryan McQuen"/><br /><sub><b>Ryan McQuen</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=ryanpcmcquen" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/AnnikaCodes"><img src="https://avatars3.githubusercontent.com/u/56906084?v=4?s=100" width="100px;" alt="Annika"/><br /><sub><b>Annika</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/pulls?q=is%3Apr+reviewed-by%3AAnnikaCodes" title="Reviewed Pull Requests">👀</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://darnuria.eu"><img src="https://avatars1.githubusercontent.com/u/2827553?v=4?s=100" width="100px;" alt="Axel Viala"/><br /><sub><b>Axel Viala</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=darnuria" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://sazid.github.io"><img src="https://avatars1.githubusercontent.com/u/2370167?v=4?s=100" width="100px;" alt="Mohammed Sazid Al Rashid"/><br /><sub><b>Mohammed Sazid Al Rashid</b></sub></a><br /><a href="#content-sazid" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/commits?author=sazid" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://codingthemsoftly.com"><img src="https://avatars1.githubusercontent.com/u/17479099?v=4?s=100" width="100px;" alt="Caleb Webber"/><br /><sub><b>Caleb Webber</b></sub></a><br /><a href="#maintenance-seeplusplus" title="Maintenance">🚧</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/pcn"><img src="https://avatars2.githubusercontent.com/u/1056756?v=4?s=100" width="100px;" alt="Peter N"/><br /><sub><b>Peter N</b></sub></a><br /><a href="#maintenance-pcn" title="Maintenance">🚧</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/seancad"><img src="https://avatars1.githubusercontent.com/u/47405611?v=4?s=100" width="100px;" alt="seancad"/><br /><sub><b>seancad</b></sub></a><br /><a href="#maintenance-seancad" title="Maintenance">🚧</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://willhayworth.com"><img src="https://avatars3.githubusercontent.com/u/181174?v=4?s=100" width="100px;" alt="Will Hayworth"/><br /><sub><b>Will Hayworth</b></sub></a><br /><a href="#content-wsh" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/chrizel"><img src="https://avatars3.githubusercontent.com/u/20802?v=4?s=100" width="100px;" alt="Christian Zeller"/><br /><sub><b>Christian Zeller</b></sub></a><br /><a href="#content-chrizel" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jfchevrette"><img src="https://avatars.githubusercontent.com/u/3001?v=4?s=100" width="100px;" alt="Jean-Francois Chevrette"/><br /><sub><b>Jean-Francois Chevrette</b></sub></a><br /><a href="#content-jfchevrette" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/commits?author=jfchevrette" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jbaber"><img src="https://avatars.githubusercontent.com/u/1908117?v=4?s=100" width="100px;" alt="John Baber-Lucero"/><br /><sub><b>John Baber-Lucero</b></sub></a><br /><a href="#content-jbaber" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tal-zvon"><img src="https://avatars.githubusercontent.com/u/3195851?v=4?s=100" width="100px;" alt="Tal"/><br /><sub><b>Tal</b></sub></a><br /><a href="#content-tal-zvon" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/apogeeoak"><img src="https://avatars.githubusercontent.com/u/59737221?v=4?s=100" width="100px;" alt="apogeeoak"/><br /><sub><b>apogeeoak</b></sub></a><br /><a href="#content-apogeeoak" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/commits?author=apogeeoak" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://www.garfieldtech.com/"><img src="https://avatars.githubusercontent.com/u/254863?v=4?s=100" width="100px;" alt="Larry Garfield"/><br /><sub><b>Larry Garfield</b></sub></a><br /><a href="#content-Crell" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/circumspect"><img src="https://avatars.githubusercontent.com/u/40770208?v=4?s=100" width="100px;" alt="circumspect"/><br /><sub><b>circumspect</b></sub></a><br /><a href="#content-circumspect" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cjwyett"><img src="https://avatars.githubusercontent.com/u/34195737?v=4?s=100" width="100px;" alt="Cyrus Wyett"/><br /><sub><b>Cyrus Wyett</b></sub></a><br /><a href="#content-cjwyett" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cadolphs"><img src="https://avatars.githubusercontent.com/u/13894820?v=4?s=100" width="100px;" alt="cadolphs"/><br /><sub><b>cadolphs</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=cadolphs" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.haveneer.com"><img src="https://avatars.githubusercontent.com/u/26146722?v=4?s=100" width="100px;" alt="Pascal H."/><br /><sub><b>Pascal H.</b></sub></a><br /><a href="#content-hpwxf" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://twitter.com/chapeupreto"><img src="https://avatars.githubusercontent.com/u/834048?v=4?s=100" width="100px;" alt="Rod Elias"/><br /><sub><b>Rod Elias</b></sub></a><br /><a href="#content-chapeupreto" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/blerchy"><img src="https://avatars.githubusercontent.com/u/2555355?v=4?s=100" width="100px;" alt="Matt Lebl"/><br /><sub><b>Matt Lebl</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=blerchy" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://flakolefluk.dev"><img src="https://avatars.githubusercontent.com/u/11986564?v=4?s=100" width="100px;" alt="Ignacio Le Fluk"/><br /><sub><b>Ignacio Le Fluk</b></sub></a><br /><a href="#content-flakolefluk" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tlyu"><img src="https://avatars.githubusercontent.com/u/431873?v=4?s=100" width="100px;" alt="Taylor Yu"/><br /><sub><b>Taylor Yu</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=tlyu" title="Code">💻</a> <a href="#content-tlyu" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://zerotask.github.io"><img src="https://avatars.githubusercontent.com/u/20150243?v=4?s=100" width="100px;" alt="Patrick Hintermayer"/><br /><sub><b>Patrick Hintermayer</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Zerotask" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://petkopavlovski.com/"><img src="https://avatars.githubusercontent.com/u/32264020?v=4?s=100" width="100px;" alt="Pete Pavlovski"/><br /><sub><b>Pete Pavlovski</b></sub></a><br /><a href="#content-arthas168" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/k12ish"><img src="https://avatars.githubusercontent.com/u/45272873?v=4?s=100" width="100px;" alt="k12ish"/><br /><sub><b>k12ish</b></sub></a><br /><a href="#content-k12ish" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/hongshaoyang"><img src="https://avatars.githubusercontent.com/u/19281800?v=4?s=100" width="100px;" alt="Shao Yang Hong"/><br /><sub><b>Shao Yang Hong</b></sub></a><br /><a href="#content-hongshaoyang" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bmacer"><img src="https://avatars.githubusercontent.com/u/13931806?v=4?s=100" width="100px;" alt="Brandon Macer"/><br /><sub><b>Brandon Macer</b></sub></a><br /><a href="#content-bmacer" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stoiandan"><img src="https://avatars.githubusercontent.com/u/10388612?v=4?s=100" width="100px;" alt="Stoian Dan"/><br /><sub><b>Stoian Dan</b></sub></a><br /><a href="#content-stoiandan" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://about.me/pjdelport"><img src="https://avatars.githubusercontent.com/u/630271?v=4?s=100" width="100px;" alt="Pi Delport"/><br /><sub><b>Pi Delport</b></sub></a><br /><a href="#content-PiDelport" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sateeshkumarb"><img src="https://avatars.githubusercontent.com/u/429263?v=4?s=100" width="100px;" alt="Sateesh "/><br /><sub><b>Sateesh </b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=sateeshkumarb" title="Code">💻</a> <a href="#content-sateeshkumarb" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/kayuapi"><img src="https://avatars.githubusercontent.com/u/10304328?v=4?s=100" width="100px;" alt="ZC"/><br /><sub><b>ZC</b></sub></a><br /><a href="#content-kayuapi" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/hyperparabolic"><img src="https://avatars.githubusercontent.com/u/12348474?v=4?s=100" width="100px;" alt="hyperparabolic"/><br /><sub><b>hyperparabolic</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=hyperparabolic" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.net4visions.at"><img src="https://avatars.githubusercontent.com/u/5228369?v=4?s=100" width="100px;" alt="arlecchino"/><br /><sub><b>arlecchino</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=kolbma" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://richthofen.io/"><img src="https://avatars.githubusercontent.com/u/7576730?v=4?s=100" width="100px;" alt="Richthofen"/><br /><sub><b>Richthofen</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=jazzplato" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cseltol"><img src="https://avatars.githubusercontent.com/u/64264529?v=4?s=100" width="100px;" alt="Ivan Nerazumov"/><br /><sub><b>Ivan Nerazumov</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=cseltol" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lauralindzey"><img src="https://avatars.githubusercontent.com/u/65185744?v=4?s=100" width="100px;" alt="lauralindzey"/><br /><sub><b>lauralindzey</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=lauralindzey" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sinharaksh1t"><img src="https://avatars.githubusercontent.com/u/28585848?v=4?s=100" width="100px;" alt="Rakshit Sinha"/><br /><sub><b>Rakshit Sinha</b></sub></a><br /><a href="#content-sinharaksh1t" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/dbednar230"><img src="https://avatars.githubusercontent.com/u/54457902?v=4?s=100" width="100px;" alt="Damian"/><br /><sub><b>Damian</b></sub></a><br /><a href="#content-dbednar230" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://benarmstead.co.uk"><img src="https://avatars.githubusercontent.com/u/70973680?v=4?s=100" width="100px;" alt="Ben Armstead"/><br /><sub><b>Ben Armstead</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=benarmstead" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/anuk909"><img src="https://avatars.githubusercontent.com/u/34924662?v=4?s=100" width="100px;" alt="anuk909"/><br /><sub><b>anuk909</b></sub></a><br /><a href="#content-anuk909" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/commits?author=anuk909" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://granddaifuku.com/"><img src="https://avatars.githubusercontent.com/u/49578068?v=4?s=100" width="100px;" alt="granddaifuku"/><br /><sub><b>granddaifuku</b></sub></a><br /><a href="#content-granddaifuku" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://weilet.me"><img src="https://avatars.githubusercontent.com/u/32561597?v=4?s=100" width="100px;" alt="Weilet"/><br /><sub><b>Weilet</b></sub></a><br /><a href="#content-Weilet" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Millione"><img src="https://avatars.githubusercontent.com/u/38575932?v=4?s=100" width="100px;" alt="LIU JIE"/><br /><sub><b>LIU JIE</b></sub></a><br /><a href="#content-Millione" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/abusch"><img src="https://avatars.githubusercontent.com/u/506344?v=4?s=100" width="100px;" alt="Antoine Büsch"/><br /><sub><b>Antoine Büsch</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=abusch" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://frogtd.com/"><img src="https://avatars.githubusercontent.com/u/31412003?v=4?s=100" width="100px;" alt="frogtd"/><br /><sub><b>frogtd</b></sub></a><br /><a href="#content-frogtd" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/EmisonLu"><img src="https://avatars.githubusercontent.com/u/54395432?v=4?s=100" width="100px;" alt="Zhenghao Lu"/><br /><sub><b>Zhenghao Lu</b></sub></a><br /><a href="#content-EmisonLu" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://soundtrackyourbrand.com"><img src="https://avatars.githubusercontent.com/u/762956?v=4?s=100" width="100px;" alt="Fredrik Enestad"/><br /><sub><b>Fredrik Enestad</b></sub></a><br /><a href="#content-fredr" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://xuesong.pydevops.com"><img src="https://avatars.githubusercontent.com/u/18476085?v=4?s=100" width="100px;" alt="xuesong"/><br /><sub><b>xuesong</b></sub></a><br /><a href="#content-xuesongbj" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MpdWalsh"><img src="https://avatars.githubusercontent.com/u/48160144?v=4?s=100" width="100px;" alt="Michael Walsh"/><br /><sub><b>Michael Walsh</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=MpdWalsh" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/alirezaghey"><img src="https://avatars.githubusercontent.com/u/26653424?v=4?s=100" width="100px;" alt="alirezaghey"/><br /><sub><b>alirezaghey</b></sub></a><br /><a href="#content-alirezaghey" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/frvannes16"><img src="https://avatars.githubusercontent.com/u/3188475?v=4?s=100" width="100px;" alt="Franklin van Nes"/><br /><sub><b>Franklin van Nes</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=frvannes16" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://nekonako.github.io"><img src="https://avatars.githubusercontent.com/u/46141275?v=4?s=100" width="100px;" alt="nekonako"/><br /><sub><b>nekonako</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nekonako" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tan-zx"><img src="https://avatars.githubusercontent.com/u/67887489?v=4?s=100" width="100px;" alt="ZX"/><br /><sub><b>ZX</b></sub></a><br /><a href="#content-tan-zx" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/sundevilyang"><img src="https://avatars.githubusercontent.com/u/1499214?v=4?s=100" width="100px;" alt="Yang Wen"/><br /><sub><b>Yang Wen</b></sub></a><br /><a href="#content-sundevilyang" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://brandon-high.com"><img src="https://avatars.githubusercontent.com/u/759848?v=4?s=100" width="100px;" alt="Brandon High"/><br /><sub><b>Brandon High</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=highb" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/x-hgg-x"><img src="https://avatars.githubusercontent.com/u/39058530?v=4?s=100" width="100px;" alt="x-hgg-x"/><br /><sub><b>x-hgg-x</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=x-hgg-x" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://kisaragieffective.github.io"><img src="https://avatars.githubusercontent.com/u/48310258?v=4?s=100" width="100px;" alt="Kisaragi"/><br /><sub><b>Kisaragi</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=KisaragiEffective" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Kallu-A"><img src="https://avatars.githubusercontent.com/u/73198738?v=4?s=100" width="100px;" alt="Lucas Aries"/><br /><sub><b>Lucas Aries</b></sub></a><br /><a href="#content-Kallu-A" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ragreenburg"><img src="https://avatars.githubusercontent.com/u/24358100?v=4?s=100" width="100px;" alt="ragreenburg"/><br /><sub><b>ragreenburg</b></sub></a><br /><a href="#content-ragreenburg" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stevenfukase"><img src="https://avatars.githubusercontent.com/u/66785624?v=4?s=100" width="100px;" alt="stevenfukase"/><br /><sub><b>stevenfukase</b></sub></a><br /><a href="#content-stevenfukase" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/J-S-Kim"><img src="https://avatars.githubusercontent.com/u/17569303?v=4?s=100" width="100px;" alt="J-S-Kim"/><br /><sub><b>J-S-Kim</b></sub></a><br /><a href="#content-J-S-Kim" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Fointard"><img src="https://avatars.githubusercontent.com/u/9333398?v=4?s=100" width="100px;" alt="Fointard"/><br /><sub><b>Fointard</b></sub></a><br /><a href="#content-Fointard" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rytheo"><img src="https://avatars.githubusercontent.com/u/22184325?v=4?s=100" width="100px;" alt="Ryan Lowe"/><br /><sub><b>Ryan Lowe</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=rytheo" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://www.dashen.tech"><img src="https://avatars.githubusercontent.com/u/15921519?v=4?s=100" width="100px;" alt="cui fliter"/><br /><sub><b>cui fliter</b></sub></a><br /><a href="#content-cuishuang" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/luskwater"><img src="https://avatars.githubusercontent.com/u/42529?v=4?s=100" width="100px;" alt="Ron Lusk"/><br /><sub><b>Ron Lusk</b></sub></a><br /><a href="#content-luskwater" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://liby.github.io/liby/"><img src="https://avatars.githubusercontent.com/u/38807139?v=4?s=100" width="100px;" alt="Bryan Lee"/><br /><sub><b>Bryan Lee</b></sub></a><br /><a href="#content-liby" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://nandaja.space"><img src="https://avatars.githubusercontent.com/u/2624550?v=4?s=100" width="100px;" alt="Nandaja Varma"/><br /><sub><b>Nandaja Varma</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nandajavarma" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/merelymyself"><img src="https://avatars.githubusercontent.com/u/88221256?v=4?s=100" width="100px;" alt="pwygab"/><br /><sub><b>pwygab</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=merelymyself" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://linkedin.com/in/lucasgrvarela"><img src="https://avatars.githubusercontent.com/u/37870368?v=4?s=100" width="100px;" alt="Lucas Grigolon Varela"/><br /><sub><b>Lucas Grigolon Varela</b></sub></a><br /><a href="#content-lucasgrvarela" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bufo24"><img src="https://avatars.githubusercontent.com/u/32884105?v=4?s=100" width="100px;" alt="Bufo"/><br /><sub><b>Bufo</b></sub></a><br /><a href="#content-bufo24" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://rustnote.com"><img src="https://avatars.githubusercontent.com/u/77730378?v=4?s=100" width="100px;" alt="Jack Clayton"/><br /><sub><b>Jack Clayton</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=jackos" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/klkl0808"><img src="https://avatars.githubusercontent.com/u/24694249?v=4?s=100" width="100px;" alt="Konstantin"/><br /><sub><b>Konstantin</b></sub></a><br /><a href="#content-klkl0808" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/0pling"><img src="https://avatars.githubusercontent.com/u/104090344?v=4?s=100" width="100px;" alt="0pling"/><br /><sub><b>0pling</b></sub></a><br /><a href="#content-0pling" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/KatanaFluorescent"><img src="https://avatars.githubusercontent.com/u/60199077?v=4?s=100" width="100px;" alt="KatanaFluorescent"/><br /><sub><b>KatanaFluorescent</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=KatanaFluorescent" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Drew-Morris"><img src="https://avatars.githubusercontent.com/u/95818166?v=4?s=100" width="100px;" alt="Drew Morris"/><br /><sub><b>Drew Morris</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Drew-Morris" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/camperdue42"><img src="https://avatars.githubusercontent.com/u/43047763?v=4?s=100" width="100px;" alt="camperdue42"/><br /><sub><b>camperdue42</b></sub></a><br /><a href="#content-camperdue42" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/YsuOS"><img src="https://avatars.githubusercontent.com/u/30138661?v=4?s=100" width="100px;" alt="YsuOS"/><br /><sub><b>YsuOS</b></sub></a><br /><a href="#content-YsuOS" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://lichess.org/@/StevenEmily"><img src="https://avatars.githubusercontent.com/u/58114641?v=4?s=100" width="100px;" alt="Steven Nguyen"/><br /><sub><b>Steven Nguyen</b></sub></a><br /><a href="#content-icecream17" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://noahcairns.dev"><img src="https://avatars.githubusercontent.com/u/94420090?v=4?s=100" width="100px;" alt="nacairns1"/><br /><sub><b>nacairns1</b></sub></a><br /><a href="#content-nacairns1" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/pgjbz"><img src="https://avatars.githubusercontent.com/u/22059237?v=4?s=100" width="100px;" alt="Paulo Gabriel Justino Bezerra"/><br /><sub><b>Paulo Gabriel Justino Bezerra</b></sub></a><br /><a href="#content-pgjbz" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jaystile"><img src="https://avatars.githubusercontent.com/u/46078028?v=4?s=100" width="100px;" alt="Jason"/><br /><sub><b>Jason</b></sub></a><br /><a href="#content-jaystile" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://exdx.github.io"><img src="https://avatars.githubusercontent.com/u/31546601?v=4?s=100" width="100px;" alt="exdx"/><br /><sub><b>exdx</b></sub></a><br /><a href="#content-exdx" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Jzow"><img src="https://avatars.githubusercontent.com/u/68860495?v=4?s=100" width="100px;" alt="James Zow"/><br /><sub><b>James Zow</b></sub></a><br /><a href="#content-Jzow" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://jamesabromley.wordpress.com/"><img src="https://avatars.githubusercontent.com/u/2474334?v=4?s=100" width="100px;" alt="James Bromley"/><br /><sub><b>James Bromley</b></sub></a><br /><a href="#content-jayber" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/swhiteCQC"><img src="https://avatars.githubusercontent.com/u/77438466?v=4?s=100" width="100px;" alt="swhiteCQC"/><br /><sub><b>swhiteCQC</b></sub></a><br /><a href="#content-swhiteCQC" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/neilpate"><img src="https://avatars.githubusercontent.com/u/7802334?v=4?s=100" width="100px;" alt="Neil Pate"/><br /><sub><b>Neil Pate</b></sub></a><br /><a href="#content-neilpate" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://wojexe.com"><img src="https://avatars.githubusercontent.com/u/21208490?v=4?s=100" width="100px;" alt="wojexe"/><br /><sub><b>wojexe</b></sub></a><br /><a href="#content-wojexe" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Tostapunk"><img src="https://avatars.githubusercontent.com/u/25140297?v=4?s=100" width="100px;" alt="Mattia Schiavon"/><br /><sub><b>Mattia Schiavon</b></sub></a><br /><a href="#content-Tostapunk" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://toucantoco.com"><img src="https://avatars.githubusercontent.com/u/18406791?v=4?s=100" width="100px;" alt="Eric Jolibois"/><br /><sub><b>Eric Jolibois</b></sub></a><br /><a href="#content-PrettyWood" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://edwinchang.vercel.app"><img src="https://avatars.githubusercontent.com/u/88263098?v=4?s=100" width="100px;" alt="Edwin Chang"/><br /><sub><b>Edwin Chang</b></sub></a><br /><a href="#content-EdwinChang24" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://saikat.dev/"><img src="https://avatars.githubusercontent.com/u/7412443?v=4?s=100" width="100px;" alt="Saikat Das"/><br /><sub><b>Saikat Das</b></sub></a><br /><a href="#content-saikatdas0790" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/thatlittleboy"><img src="https://avatars.githubusercontent.com/u/30731072?v=4?s=100" width="100px;" alt="Jeremy Goh"/><br /><sub><b>Jeremy Goh</b></sub></a><br /><a href="#content-thatlittleboy" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Lioness100"><img src="https://avatars.githubusercontent.com/u/65814829?v=4?s=100" width="100px;" alt="Lioness100"/><br /><sub><b>Lioness100</b></sub></a><br /><a href="#content-Lioness100" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tvkn"><img src="https://avatars.githubusercontent.com/u/79277926?v=4?s=100" width="100px;" alt="Tristan Nicholls"/><br /><sub><b>Tristan Nicholls</b></sub></a><br /><a href="#content-tvkn" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://clairewang.net"><img src="https://avatars.githubusercontent.com/u/9344258?v=4?s=100" width="100px;" alt="Claire"/><br /><sub><b>Claire</b></sub></a><br /><a href="#content-clairew" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Mouwrice"><img src="https://avatars.githubusercontent.com/u/56763273?v=4?s=100" width="100px;" alt="Maurice Van Wassenhove"/><br /><sub><b>Maurice Van Wassenhove</b></sub></a><br /><a href="#content-Mouwrice" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://jmthree.com"><img src="https://avatars.githubusercontent.com/u/77524?v=4?s=100" width="100px;" alt="John Mendelewski"/><br /><sub><b>John Mendelewski</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=johnmendel" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://fakhoury.xyz"><img src="https://avatars.githubusercontent.com/u/20828724?v=4?s=100" width="100px;" alt="Brian Fakhoury"/><br /><sub><b>Brian Fakhoury</b></sub></a><br /><a href="#content-brianfakhoury" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/markusboehme"><img src="https://avatars.githubusercontent.com/u/5074759?v=4?s=100" width="100px;" alt="Markus Boehme"/><br /><sub><b>Markus Boehme</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=markusboehme" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nico-vromans"><img src="https://avatars.githubusercontent.com/u/48183857?v=4?s=100" width="100px;" alt="Nico Vromans"/><br /><sub><b>Nico Vromans</b></sub></a><br /><a href="#content-nico-vromans" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/vostok92"><img src="https://avatars.githubusercontent.com/u/540339?v=4?s=100" width="100px;" alt="vostok92"/><br /><sub><b>vostok92</b></sub></a><br /><a href="#content-vostok92" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://magnusrodseth.vercel.app"><img src="https://avatars.githubusercontent.com/u/59113973?v=4?s=100" width="100px;" alt="Magnus Rødseth"/><br /><sub><b>Magnus Rødseth</b></sub></a><br /><a href="#content-magnusrodseth" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rubiesonthesky"><img src="https://avatars.githubusercontent.com/u/2591240?v=4?s=100" width="100px;" alt="rubiesonthesky"/><br /><sub><b>rubiesonthesky</b></sub></a><br /><a href="#content-rubiesonthesky" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://www.gabrielbianconi.com/"><img src="https://avatars.githubusercontent.com/u/1275491?v=4?s=100" width="100px;" alt="Gabriel Bianconi"/><br /><sub><b>Gabriel Bianconi</b></sub></a><br /><a href="#content-GabrielBianconi" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Kodylow"><img src="https://avatars.githubusercontent.com/u/74332828?v=4?s=100" width="100px;" alt="Kody Low"/><br /><sub><b>Kody Low</b></sub></a><br /><a href="#content-Kodylow" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rzrymiak"><img src="https://avatars.githubusercontent.com/u/106121613?v=4?s=100" width="100px;" alt="rzrymiak"/><br /><sub><b>rzrymiak</b></sub></a><br /><a href="#content-rzrymiak" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/miguelraz"><img src="https://avatars.githubusercontent.com/u/13056181?v=4?s=100" width="100px;" alt="Miguel Raz Guzmán Macedo"/><br /><sub><b>Miguel Raz Guzmán Macedo</b></sub></a><br /><a href="#content-miguelraz" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/memark"><img src="https://avatars.githubusercontent.com/u/318504?v=4?s=100" width="100px;" alt="Magnus Markling"/><br /><sub><b>Magnus Markling</b></sub></a><br /><a href="#content-memark" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gasparitiago"><img src="https://avatars.githubusercontent.com/u/3237254?v=4?s=100" width="100px;" alt="Tiago De Gaspari"/><br /><sub><b>Tiago De Gaspari</b></sub></a><br /><a href="#content-gasparitiago" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/skaunov"><img src="https://avatars.githubusercontent.com/u/65976143?v=4?s=100" width="100px;" alt="skaunov"/><br /><sub><b>skaunov</b></sub></a><br /><a href="#content-skaunov" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://caljacobson.dev"><img src="https://avatars.githubusercontent.com/u/9152032?v=4?s=100" width="100px;" alt="Cal Jacobson"/><br /><sub><b>Cal Jacobson</b></sub></a><br /><a href="#content-cj81499" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/duchonic"><img src="https://avatars.githubusercontent.com/u/34117620?v=4?s=100" width="100px;" alt="Duchoud Nicolas"/><br /><sub><b>Duchoud Nicolas</b></sub></a><br /><a href="#content-duchonic" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gfaugere"><img src="https://avatars.githubusercontent.com/u/11901979?v=4?s=100" width="100px;" alt="Gaëtan Faugère"/><br /><sub><b>Gaëtan Faugère</b></sub></a><br /><a href="#tool-gfaugere" title="Tools">🔧</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/bhbuehler"><img src="https://avatars.githubusercontent.com/u/25541343?v=4?s=100" width="100px;" alt="bhbuehler"/><br /><sub><b>bhbuehler</b></sub></a><br /><a href="#content-bhbuehler" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nyurik"><img src="https://avatars.githubusercontent.com/u/1641515?v=4?s=100" width="100px;" alt="Yuri Astrakhan"/><br /><sub><b>Yuri Astrakhan</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nyurik" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://azzamsa.com"><img src="https://avatars.githubusercontent.com/u/17734314?v=4?s=100" width="100px;" alt="azzamsa"/><br /><sub><b>azzamsa</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=azzamsa" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mvanschellebeeck"><img src="https://avatars.githubusercontent.com/u/17671052?v=4?s=100" width="100px;" alt="mvanschellebeeck"/><br /><sub><b>mvanschellebeeck</b></sub></a><br /><a href="#content-mvanschellebeeck" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/aaarkid"><img src="https://avatars.githubusercontent.com/u/39987510?v=4?s=100" width="100px;" alt="Arkid"/><br /><sub><b>Arkid</b></sub></a><br /><a href="#content-aaarkid" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://tfpk.dev"><img src="https://avatars.githubusercontent.com/u/10906982?v=4?s=100" width="100px;" alt="Tom Kunc"/><br /><sub><b>Tom Kunc</b></sub></a><br /><a href="#content-tfpk" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mfurak"><img src="https://avatars.githubusercontent.com/u/38523093?v=4?s=100" width="100px;" alt="Marek Furák"/><br /><sub><b>Marek Furák</b></sub></a><br /><a href="#content-mfurak" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://winter.cafe"><img src="https://avatars.githubusercontent.com/u/78392041?v=4?s=100" width="100px;" alt="Winter"/><br /><sub><b>Winter</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=winterqt" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://moritzboeh.me"><img src="https://avatars.githubusercontent.com/u/42215704?v=4?s=100" width="100px;" alt="Moritz Böhme"/><br /><sub><b>Moritz Böhme</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=MoritzBoehme" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/craymel"><img src="https://avatars.githubusercontent.com/u/71062756?v=4?s=100" width="100px;" alt="craymel"/><br /><sub><b>craymel</b></sub></a><br /><a href="#content-craymel" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tkburis"><img src="https://avatars.githubusercontent.com/u/20501289?v=4?s=100" width="100px;" alt="TK Buristrakul"/><br /><sub><b>TK Buristrakul</b></sub></a><br /><a href="#content-tkburis" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/HerschelW"><img src="https://avatars.githubusercontent.com/u/17935816?v=4?s=100" width="100px;" alt="Kent Worthington"/><br /><sub><b>Kent Worthington</b></sub></a><br /><a href="#content-HerschelW" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/seporterfield"><img src="https://avatars.githubusercontent.com/u/107010978?v=4?s=100" width="100px;" alt="seporterfield"/><br /><sub><b>seporterfield</b></sub></a><br /><a href="#content-seporterfield" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/dbarrosop"><img src="https://avatars.githubusercontent.com/u/6246622?v=4?s=100" width="100px;" alt="David Barroso"/><br /><sub><b>David Barroso</b></sub></a><br /><a href="#infra-dbarrosop" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://distanz.ch"><img src="https://avatars.githubusercontent.com/u/539708?v=4?s=100" width="100px;" alt="Tobias Klauser"/><br /><sub><b>Tobias Klauser</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=tklauser" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/0xMySt1c"><img src="https://avatars.githubusercontent.com/u/101825630?v=4?s=100" width="100px;" alt="0xMySt1c"/><br /><sub><b>0xMySt1c</b></sub></a><br /><a href="#tool-0xMySt1c" title="Tools">🔧</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/AxolotlTears"><img src="https://avatars.githubusercontent.com/u/87157047?v=4?s=100" width="100px;" alt="Ten"/><br /><sub><b>Ten</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=AxolotlTears" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://h4x5p4c3.xyz"><img src="https://avatars.githubusercontent.com/u/66133688?v=4?s=100" width="100px;" alt="jones martin"/><br /><sub><b>jones martin</b></sub></a><br /><a href="#content-h4x5p4c3" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/cloppingemu"><img src="https://avatars.githubusercontent.com/u/12227963?v=4?s=100" width="100px;" alt="cloppingemu"/><br /><sub><b>cloppingemu</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=cloppingemu" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://github.com/zeromicro/go-zero"><img src="https://avatars.githubusercontent.com/u/1918356?v=4?s=100" width="100px;" alt="Kevin Wan"/><br /><sub><b>Kevin Wan</b></sub></a><br /><a href="#content-kevwan" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://kurowasaruby.cn"><img src="https://avatars.githubusercontent.com/u/43495006?v=4?s=100" width="100px;" alt="Ruby"/><br /><sub><b>Ruby</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=wjwrh" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/alexandergill"><img src="https://avatars.githubusercontent.com/u/7033716?v=4?s=100" width="100px;" alt="Alexander Gill"/><br /><sub><b>Alexander Gill</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=alexandergill" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/jarrod-sanders/"><img src="https://avatars.githubusercontent.com/u/50600614?v=4?s=100" width="100px;" alt="Jarrod Sanders"/><br /><sub><b>Jarrod Sanders</b></sub></a><br /><a href="#content-kawaiiPlat" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/platformer"><img src="https://avatars.githubusercontent.com/u/40146328?v=4?s=100" width="100px;" alt="Andrew Sen"/><br /><sub><b>Andrew Sen</b></sub></a><br /><a href="#content-platformer" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://grzegorz-zur.com/"><img src="https://avatars.githubusercontent.com/u/5297583?v=4?s=100" width="100px;" alt="Grzegorz Żur"/><br /><sub><b>Grzegorz Żur</b></sub></a><br /><a href="#content-grzegorz-zur" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/black-puppydog"><img src="https://avatars.githubusercontent.com/u/189241?v=4?s=100" width="100px;" alt="Daan Wynen"/><br /><sub><b>Daan Wynen</b></sub></a><br /><a href="#content-black-puppydog" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Anush008"><img src="https://avatars.githubusercontent.com/u/46051506?v=4?s=100" width="100px;" alt="Anush"/><br /><sub><b>Anush</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Anush008" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/shgew"><img src="https://avatars.githubusercontent.com/u/5584672?v=4?s=100" width="100px;" alt="Gleb Shevchenko"/><br /><sub><b>Gleb Shevchenko</b></sub></a><br /><a href="#content-shgew" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mdmundo"><img src="https://avatars.githubusercontent.com/u/60408300?v=4?s=100" width="100px;" alt="Edmundo Paulino"/><br /><sub><b>Edmundo Paulino</b></sub></a><br /><a href="#infra-mdmundo" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/eroullit"><img src="https://avatars.githubusercontent.com/u/301795?v=4?s=100" width="100px;" alt="Emmanuel Roullit"/><br /><sub><b>Emmanuel Roullit</b></sub></a><br /><a href="#infra-eroullit" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://nidhalmessaoudi.herokuapp.com"><img src="https://avatars.githubusercontent.com/u/63377412?v=4?s=100" width="100px;" alt="Nidhal Messaoudi"/><br /><sub><b>Nidhal Messaoudi</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nidhalmessaoudi" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/MahdiBM"><img src="https://avatars.githubusercontent.com/u/54685446?v=4?s=100" width="100px;" alt="Mahdi Bahrami"/><br /><sub><b>Mahdi Bahrami</b></sub></a><br /><a href="#tool-MahdiBM" title="Tools">🔧</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Nagidal"><img src="https://avatars.githubusercontent.com/u/7075397?v=4?s=100" width="100px;" alt="Nagidal"/><br /><sub><b>Nagidal</b></sub></a><br /><a href="#content-Nagidal" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://adabrew.com"><img src="https://avatars.githubusercontent.com/u/25161597?v=4?s=100" width="100px;" alt="Adam Brewer"/><br /><sub><b>Adam Brewer</b></sub></a><br /><a href="#content-adamhb123" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/eugkhp"><img src="https://avatars.githubusercontent.com/u/25910599?v=4?s=100" width="100px;" alt="Eugene"/><br /><sub><b>Eugene</b></sub></a><br /><a href="#tool-eugkhp" title="Tools">🔧</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://social.linux.pizza/@navicore"><img src="https://avatars.githubusercontent.com/u/110999?v=4?s=100" width="100px;" alt="Ed Sweeney"/><br /><sub><b>Ed Sweeney</b></sub></a><br /><a href="#content-navicore" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/javihernant"><img src="https://avatars.githubusercontent.com/u/73640929?v=4?s=100" width="100px;" alt="javihernant"/><br /><sub><b>javihernant</b></sub></a><br /><a href="#content-javihernant" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/VegardMatthey"><img src="https://avatars.githubusercontent.com/u/59250656?v=4?s=100" width="100px;" alt="Vegard"/><br /><sub><b>Vegard</b></sub></a><br /><a href="#content-VegardMatthey" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ryanwhitehouse"><img src="https://avatars.githubusercontent.com/u/13400784?v=4?s=100" width="100px;" alt="Ryan Whitehouse"/><br /><sub><b>Ryan Whitehouse</b></sub></a><br /><a href="#content-ryanwhitehouse" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/guoard"><img src="https://avatars.githubusercontent.com/u/65511355?v=4?s=100" width="100px;" alt="Ali Afsharzadeh"/><br /><sub><b>Ali Afsharzadeh</b></sub></a><br /><a href="#content-guoard" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://keogami.ml"><img src="https://avatars.githubusercontent.com/u/41939011?v=4?s=100" width="100px;" alt="Keogami"/><br /><sub><b>Keogami</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=keogami" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/ahresse"><img src="https://avatars.githubusercontent.com/u/28402488?v=4?s=100" width="100px;" alt="Alexandre Esse"/><br /><sub><b>Alexandre Esse</b></sub></a><br /><a href="#content-ahresse" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://resilient.tech"><img src="https://avatars.githubusercontent.com/u/16315650?v=4?s=100" width="100px;" alt="Sagar Vora"/><br /><sub><b>Sagar Vora</b></sub></a><br /><a href="#content-sagarvora" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/poneciak57"><img src="https://avatars.githubusercontent.com/u/94321164?v=4?s=100" width="100px;" alt="Kacper Poneta"/><br /><sub><b>Kacper Poneta</b></sub></a><br /><a href="#content-poneciak57" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://ktheory.com/"><img src="https://avatars.githubusercontent.com/u/975?v=4?s=100" width="100px;" alt="Aaron Suggs"/><br /><sub><b>Aaron Suggs</b></sub></a><br /><a href="#content-ktheory" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/alexwh"><img src="https://avatars.githubusercontent.com/u/1723612?v=4?s=100" width="100px;" alt="Alex"/><br /><sub><b>Alex</b></sub></a><br /><a href="#content-alexwh" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/stornquist"><img src="https://avatars.githubusercontent.com/u/42915664?v=4?s=100" width="100px;" alt="Sebastian Törnquist"/><br /><sub><b>Sebastian Törnquist</b></sub></a><br /><a href="#content-stornquist" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://smlavine.com"><img src="https://avatars.githubusercontent.com/u/33563640?v=4?s=100" width="100px;" alt="Sebastian LaVine"/><br /><sub><b>Sebastian LaVine</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=smlavine" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://www.alangerber.us"><img src="https://avatars.githubusercontent.com/u/201313?v=4?s=100" width="100px;" alt="Alan Gerber"/><br /><sub><b>Alan Gerber</b></sub></a><br /><a href="#content-akgerber" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://esotuvaka.github.io"><img src="https://avatars.githubusercontent.com/u/104941850?v=4?s=100" width="100px;" alt="Eric"/><br /><sub><b>Eric</b></sub></a><br /><a href="#content-esotuvaka" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/az0977776"><img src="https://avatars.githubusercontent.com/u/9172038?v=4?s=100" width="100px;" alt="Aaron Wang"/><br /><sub><b>Aaron Wang</b></sub></a><br /><a href="#content-az0977776" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/nmay231"><img src="https://avatars.githubusercontent.com/u/35386821?v=4?s=100" width="100px;" alt="Noah"/><br /><sub><b>Noah</b></sub></a><br /><a href="#content-nmay231" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/rb5014"><img src="https://avatars.githubusercontent.com/u/105397317?v=4?s=100" width="100px;" alt="rb5014"/><br /><sub><b>rb5014</b></sub></a><br /><a href="#content-rb5014" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/deedy5"><img src="https://avatars.githubusercontent.com/u/65482418?v=4?s=100" width="100px;" alt="deedy5"/><br /><sub><b>deedy5</b></sub></a><br /><a href="#content-deedy5" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lionel-rowe"><img src="https://avatars.githubusercontent.com/u/26078826?v=4?s=100" width="100px;" alt="lionel-rowe"/><br /><sub><b>lionel-rowe</b></sub></a><br /><a href="#content-lionel-rowe" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Ben2917"><img src="https://avatars.githubusercontent.com/u/10279994?v=4?s=100" width="100px;" alt="Ben"/><br /><sub><b>Ben</b></sub></a><br /><a href="#content-Ben2917" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/b1ue64"><img src="https://avatars.githubusercontent.com/u/77976308?v=4?s=100" width="100px;" alt="b1ue64"/><br /><sub><b>b1ue64</b></sub></a><br /><a href="#content-b1ue64" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/lazywalker"><img src="https://avatars.githubusercontent.com/u/53956?v=4?s=100" width="100px;" alt="lazywalker"/><br /><sub><b>lazywalker</b></sub></a><br /><a href="#content-lazywalker" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/proofconstruction"><img src="https://avatars.githubusercontent.com/u/74747193?v=4?s=100" width="100px;" alt="proofconstruction"/><br /><sub><b>proofconstruction</b></sub></a><br /><a href="#infra-proofconstruction" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.youtube.com/channel/UCQCjA6qUutAtWqkCA4Z36CQ"><img src="https://avatars.githubusercontent.com/u/16007179?v=4?s=100" width="100px;" alt="IVIURRAY"/><br /><sub><b>IVIURRAY</b></sub></a><br /><a href="#content-IVIURRAY" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/b-apperlo"><img src="https://avatars.githubusercontent.com/u/91734527?v=4?s=100" width="100px;" alt="Bert Apperlo"/><br /><sub><b>Bert Apperlo</b></sub></a><br /><a href="#content-b-apperlo" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://fwdekker.com/"><img src="https://avatars.githubusercontent.com/u/13442533?v=4?s=100" width="100px;" alt="Florine W. Dekker"/><br /><sub><b>Florine W. Dekker</b></sub></a><br /><a href="#content-FWDekker" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/luhem7"><img src="https://avatars.githubusercontent.com/u/4008215?v=4?s=100" width="100px;" alt="Mehul Gangavelli"/><br /><sub><b>Mehul Gangavelli</b></sub></a><br /><a href="#content-luhem7" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Frosthage"><img src="https://avatars.githubusercontent.com/u/14823314?v=4?s=100" width="100px;" alt="Mikael Frosthage"/><br /><sub><b>Mikael Frosthage</b></sub></a><br /><a href="#content-Frosthage" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://robertfry.xyz"><img src="https://avatars.githubusercontent.com/u/43712054?v=4?s=100" width="100px;" alt="Robert Fry"/><br /><sub><b>Robert Fry</b></sub></a><br /><a href="#content-robertefry" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/tajo48"><img src="https://avatars.githubusercontent.com/u/55502906?v=4?s=100" width="100px;" alt="tajo48"/><br /><sub><b>tajo48</b></sub></a><br /><a href="#content-tajo48" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://anishchhetri.com.np"><img src="https://avatars.githubusercontent.com/u/98446102?v=4?s=100" width="100px;" alt="Anish"/><br /><sub><b>Anish</b></sub></a><br /><a href="#content-novanish" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/vnprc"><img src="https://avatars.githubusercontent.com/u/9425366?v=4?s=100" width="100px;" alt="vnprc"/><br /><sub><b>vnprc</b></sub></a><br /><a href="#content-vnprc" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://androecia.net"><img src="https://avatars.githubusercontent.com/u/61999256?v=4?s=100" width="100px;" alt="Joshua Carlson"/><br /><sub><b>Joshua Carlson</b></sub></a><br /><a href="#content-jrcarl624" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://johndesilencio.me"><img src="https://avatars.githubusercontent.com/u/20136554?v=4?s=100" width="100px;" alt="Nicholas R. Smith"/><br /><sub><b>Nicholas R. Smith</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=johnDeSilencio" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://alexfertel.me"><img src="https://avatars.githubusercontent.com/u/22298999?v=4?s=100" width="100px;" alt="Alexander González"/><br /><sub><b>Alexander González</b></sub></a><br /><a href="#content-alexfertel" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/softarn"><img src="https://avatars.githubusercontent.com/u/517619?v=4?s=100" width="100px;" alt="Marcus Höjvall"/><br /><sub><b>Marcus Höjvall</b></sub></a><br /><a href="#content-softarn" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/barlevalon"><img src="https://avatars.githubusercontent.com/u/3397911?v=4?s=100" width="100px;" alt="Alon Hearter"/><br /><sub><b>Alon Hearter</b></sub></a><br /><a href="#content-barlevalon" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/shirts"><img src="https://avatars.githubusercontent.com/u/4952151?v=4?s=100" width="100px;" alt="shirts"/><br /><sub><b>shirts</b></sub></a><br /><a href="#content-shirts" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/eLVas"><img src="https://avatars.githubusercontent.com/u/6797156?v=4?s=100" width="100px;" alt="Ivan Vasiunyk"/><br /><sub><b>Ivan Vasiunyk</b></sub></a><br /><a href="#content-eLVas" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://mo8it.com"><img src="https://avatars.githubusercontent.com/u/76752051?v=4?s=100" width="100px;" alt="Mo"/><br /><sub><b>Mo</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=mo8it" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/x10an14"><img src="https://avatars.githubusercontent.com/u/710608?v=4?s=100" width="100px;" alt="x10an14"/><br /><sub><b>x10an14</b></sub></a><br /><a href="#infra-x10an14" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/gabay"><img src="https://avatars.githubusercontent.com/u/5773610?v=4?s=100" width="100px;" alt="Roi Gabay"/><br /><sub><b>Roi Gabay</b></sub></a><br /><a href="#content-gabay" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/mkovaxx"><img src="https://avatars.githubusercontent.com/u/481354?v=4?s=100" width="100px;" alt="Máté Kovács"/><br /><sub><b>Máté Kovács</b></sub></a><br /><a href="#content-mkovaxx" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://szabgab.com/"><img src="https://avatars.githubusercontent.com/u/48833?v=4?s=100" width="100px;" alt="Gábor Szabó"/><br /><sub><b>Gábor Szabó</b></sub></a><br /><a href="#content-szabgab" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://moduslaborandi.net"><img src="https://avatars.githubusercontent.com/u/3340793?v=4?s=100" width="100px;" alt="Yamila Moreno"/><br /><sub><b>Yamila Moreno</b></sub></a><br /><a href="#content-yamila-moreno" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/willhack"><img src="https://avatars.githubusercontent.com/u/18036720?v=4?s=100" width="100px;" alt="Will Hack"/><br /><sub><b>Will Hack</b></sub></a><br /><a href="#content-willhack" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://cancompute.tech"><img src="https://avatars.githubusercontent.com/u/2052646?v=4?s=100" width="100px;" alt="Michael"/><br /><sub><b>Michael</b></sub></a><br /><a href="#content-bean5" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://www.sadiqpk.org"><img src="https://avatars.githubusercontent.com/u/1289514?v=4?s=100" width="100px;" alt="Mohammed Sadiq"/><br /><sub><b>Mohammed Sadiq</b></sub></a><br /><a href="#content-pksadiq" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/Jak-Ch-ll"><img src="https://avatars.githubusercontent.com/u/56225668?v=4?s=100" width="100px;" alt="Jakob"/><br /><sub><b>Jakob</b></sub></a><br /><a href="#content-Jak-Ch-ll" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="http://oscarbonilla.com"><img src="https://avatars.githubusercontent.com/u/4950?v=4?s=100" width="100px;" alt="Oscar Bonilla"/><br /><sub><b>Oscar Bonilla</b></sub></a><br /><a href="#content-ob" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/husjon"><img src="https://avatars.githubusercontent.com/u/554229?v=4?s=100" width="100px;" alt="Jon Erling Hustadnes"/><br /><sub><b>Jon Erling Hustadnes</b></sub></a><br /><a href="#content-husjon" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/CobaltCause"><img src="https://avatars.githubusercontent.com/u/7003738?v=4?s=100" width="100px;" alt="Charles Hall"/><br /><sub><b>Charles Hall</b></sub></a><br /><a href="#infra-CobaltCause" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/krmpotic"><img src="https://avatars.githubusercontent.com/u/10350645?v=4?s=100" width="100px;" alt="Luka Krmpotić"/><br /><sub><b>Luka Krmpotić</b></sub></a><br /><a href="#content-krmpotic" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/jurglic"><img src="https://avatars.githubusercontent.com/u/112600?v=4?s=100" width="100px;" alt="Jurglic"/><br /><sub><b>Jurglic</b></sub></a><br /><a href="#content-jurglic" title="Content">🖋</a></td>
|
||||||
|
<td align="center" valign="top" width="12.5%"><a href="https://github.com/OfirLauber"><img src="https://avatars.githubusercontent.com/u/5631030?v=4?s=100" width="100px;" alt="Ofir Lauber"/><br /><sub><b>Ofir Lauber</b></sub></a><br /><a href="#content-OfirLauber" title="Content">🖋</a></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- markdownlint-restore -->
|
||||||
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
||||||
|
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
|
836
CHANGELOG.md
836
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
|
@ -21,7 +21,7 @@ _implement a new feature! ➡️ [open an Issue to discuss it first, then a Pull
|
||||||
|
|
||||||
`rustlings` is basically a glorified `rustc` wrapper. Therefore the source code
|
`rustlings` is basically a glorified `rustc` wrapper. Therefore the source code
|
||||||
isn't really that complicated since the bulk of the work is done by `rustc`.
|
isn't really that complicated since the bulk of the work is done by `rustc`.
|
||||||
`src/main.rs` contains a simple `clap` CLI that loads from `src/verify.rs` and `src/run.rs`.
|
`src/main.rs` contains a simple `argh` CLI that connects to most of the other source files.
|
||||||
|
|
||||||
<a name="addex"></a>
|
<a name="addex"></a>
|
||||||
### Adding an exercise
|
### Adding an exercise
|
||||||
|
@ -29,7 +29,7 @@ isn't really that complicated since the bulk of the work is done by `rustc`.
|
||||||
The first step is to add the exercise! Name the file `exercises/yourTopic/yourTopicN.rs`, make sure to
|
The first step is to add the exercise! Name the file `exercises/yourTopic/yourTopicN.rs`, make sure to
|
||||||
put in some helpful links, and link to sections of the book in `exercises/yourTopic/README.md`.
|
put in some helpful links, and link to sections of the book in `exercises/yourTopic/README.md`.
|
||||||
|
|
||||||
Next make sure it runs with `rustlings`. The exercise metadata is stored in `info.toml`, under the `exercises` array. The order of the `exercises` array determines the order the exercises are run by `rustlings verify`.
|
Next make sure it runs with `rustlings`. The exercise metadata is stored in `info.toml`, under the `exercises` array. The order of the `exercises` array determines the order the exercises are run by `rustlings verify` and `rustlings watch`.
|
||||||
|
|
||||||
Add the metadata for your exercise in the correct order in the `exercises` array. If you are unsure of the correct ordering, add it at the bottom and ask in your pull request. The exercise metadata should contain the following:
|
Add the metadata for your exercise in the correct order in the `exercises` array. If you are unsure of the correct ordering, add it at the bottom and ask in your pull request. The exercise metadata should contain the following:
|
||||||
```diff
|
```diff
|
||||||
|
@ -43,7 +43,7 @@ Add the metadata for your exercise in the correct order in the `exercises` array
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
The `mode` attribute decides whether Rustlings will only compile your exercise, or compile and test it. If you have tests to verify in your exercise, choose `test`, otherwise `compile`.
|
The `mode` attribute decides whether Rustlings will only compile your exercise, or compile and test it. If you have tests to verify in your exercise, choose `test`, otherwise `compile`. If you're working on a Clippy exercise, use `mode = "clippy"`.
|
||||||
|
|
||||||
That's all! Feel free to put up a pull request.
|
That's all! Feel free to put up a pull request.
|
||||||
|
|
||||||
|
@ -67,19 +67,19 @@ changes. There's a couple of things to watch out for:
|
||||||
#### Write correct commit messages
|
#### Write correct commit messages
|
||||||
|
|
||||||
We follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0-beta.4/)
|
We follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0-beta.4/)
|
||||||
specification, because it makes it easier to generate changelogs automatically.
|
specification.
|
||||||
This means that you have to format your commit messages in a specific way. Say
|
This means that you have to format your commit messages in a specific way. Say
|
||||||
you're working on adding a new exercise called `foobar1.rs`. You could write
|
you're working on adding a new exercise called `foobar1.rs`. You could write
|
||||||
the following commit message:
|
the following commit message:
|
||||||
|
|
||||||
```
|
```
|
||||||
feat: Add foobar1.rs exercise
|
feat: add foobar1.rs exercise
|
||||||
```
|
```
|
||||||
|
|
||||||
If you're just fixing a bug, please use the `fix` type:
|
If you're just fixing a bug, please use the `fix` type:
|
||||||
|
|
||||||
```
|
```
|
||||||
fix(verify): Make sure verify doesn't self-destruct
|
fix(verify): make sure verify doesn't self-destruct
|
||||||
```
|
```
|
||||||
|
|
||||||
The scope within the brackets is optional, but should be any of these:
|
The scope within the brackets is optional, but should be any of these:
|
||||||
|
@ -96,7 +96,7 @@ When the commit also happens to close an existing issue, link it in the message
|
||||||
body:
|
body:
|
||||||
|
|
||||||
```
|
```
|
||||||
fix: Update foobar
|
fix: update foobar
|
||||||
|
|
||||||
closes #101029908
|
closes #101029908
|
||||||
```
|
```
|
||||||
|
@ -104,13 +104,13 @@ closes #101029908
|
||||||
If you're doing simple changes, like updating a book link, use `chore`:
|
If you're doing simple changes, like updating a book link, use `chore`:
|
||||||
|
|
||||||
```
|
```
|
||||||
chore: Update exercise1.rs book link
|
chore: update exercise1.rs book link
|
||||||
```
|
```
|
||||||
|
|
||||||
If you're updating documentation, use `docs`:
|
If you're updating documentation, use `docs`:
|
||||||
|
|
||||||
```
|
```
|
||||||
docs: Add more information to Readme
|
docs: add more information to Readme
|
||||||
```
|
```
|
||||||
|
|
||||||
If, and only if, you're absolutely sure you want to make a breaking change
|
If, and only if, you're absolutely sure you want to make a breaking change
|
||||||
|
@ -118,7 +118,7 @@ If, and only if, you're absolutely sure you want to make a breaking change
|
||||||
explain the breaking change in the message body:
|
explain the breaking change in the message body:
|
||||||
|
|
||||||
```
|
```
|
||||||
fix!: Completely change verification
|
fix!: completely change verification
|
||||||
|
|
||||||
BREAKING CHANGE: This has to be done because lorem ipsum dolor
|
BREAKING CHANGE: This has to be done because lorem ipsum dolor
|
||||||
```
|
```
|
||||||
|
@ -126,6 +126,5 @@ BREAKING CHANGE: This has to be done because lorem ipsum dolor
|
||||||
#### Pull Request Workflow
|
#### Pull Request Workflow
|
||||||
|
|
||||||
Once you open a Pull Request, it may be reviewed or labeled (or both) until
|
Once you open a Pull Request, it may be reviewed or labeled (or both) until
|
||||||
the maintainers accept your change. Then, [bors](https://github.com/bors) will
|
the maintainers accept your change. Please be patient, it may take some time
|
||||||
run the test suite with your changes and if it's successful, automatically
|
for this to happen!
|
||||||
merge it in!
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
31
Cargo.toml
31
Cargo.toml
|
@ -1,23 +1,30 @@
|
||||||
[package]
|
[package]
|
||||||
name = "rustlings"
|
name = "rustlings"
|
||||||
version = "4.3.0"
|
description = "Small exercises to get you used to reading and writing Rust code!"
|
||||||
authors = ["Marisa <mokou@posteo.de>", "Carol (Nichols || Goulding) <carol.nichols@gmail.com>"]
|
version = "5.6.1"
|
||||||
edition = "2018"
|
authors = [
|
||||||
|
"Liv <mokou@fastmail.com>",
|
||||||
|
"Carol (Nichols || Goulding) <carol.nichols@gmail.com>",
|
||||||
|
]
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = "2.32.0"
|
indicatif = "0.17.6"
|
||||||
indicatif = "0.10.3"
|
console = "0.15"
|
||||||
console = "0.7.7"
|
notify = "4.0"
|
||||||
notify = "4.0.15"
|
toml = "0.7.6"
|
||||||
toml = "0.4.10"
|
regex = "1.5"
|
||||||
regex = "1.1.6"
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde = {version = "1.0.10", features = ["derive"]}
|
serde_json = "1.0.81"
|
||||||
|
home = "0.5.3"
|
||||||
|
glob = "0.3.0"
|
||||||
|
clap = { version = "4.4.0", features = ["derive"] }
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "rustlings"
|
name = "rustlings"
|
||||||
path = "src/main.rs"
|
path = "src/main.rs"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
assert_cmd = "0.11.0"
|
assert_cmd = "2.0.12"
|
||||||
predicates = "1.0.1"
|
predicates = "3.0.3"
|
||||||
glob = "0.3.0"
|
glob = "0.3.0"
|
||||||
|
|
233
README.md
233
README.md
|
@ -1,9 +1,9 @@
|
||||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
<div class="oranda-hide">
|
||||||
[![All Contributors](https://img.shields.io/badge/all_contributors-83-orange.svg?style=flat-square)](#contributors-)
|
|
||||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
||||||
|
|
||||||
# rustlings 🦀❤️
|
# rustlings 🦀❤️
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages!
|
Greetings and welcome to `rustlings`. This project contains small exercises to get you used to reading and writing Rust code. This includes reading and responding to compiler messages!
|
||||||
|
|
||||||
_...looking for the old, web-based version of Rustlings? Try [here](https://github.com/rust-lang/rustlings/tree/rustlings-1)_
|
_...looking for the old, web-based version of Rustlings? Try [here](https://github.com/rust-lang/rustlings/tree/rustlings-1)_
|
||||||
|
@ -16,57 +16,77 @@ Alternatively, for a first-time Rust learner, there are several other resources:
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
_Note: If you're on MacOS, make sure you've installed Xcode and its developer tools by typing `xcode-select --install`._
|
_Note: If you're on MacOS, make sure you've installed Xcode and its developer tools by typing `xcode-select --install`._
|
||||||
|
_Note: If you're on Linux, make sure you've installed gcc. Deb: `sudo apt install gcc`. Yum: `sudo yum -y install gcc`._
|
||||||
|
|
||||||
You will need to have Rust installed. You can get it by visiting https://rustup.rs. This'll also install Cargo, Rust's package/project manager.
|
You will need to have Rust installed. You can get it by visiting <https://rustup.rs>. This'll also install Cargo, Rust's package/project manager.
|
||||||
|
|
||||||
## MacOS/Linux
|
## MacOS/Linux
|
||||||
|
|
||||||
Just run:
|
Just run:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -L https://git.io/install-rustlings | bash
|
curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash
|
||||||
# Or if you want it to be installed to a different path:
|
```
|
||||||
curl -L https://git.io/install-rustlings | bash -s mypath/
|
|
||||||
|
Or if you want it to be installed to a different path:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash -s mypath/
|
||||||
```
|
```
|
||||||
|
|
||||||
This will install Rustlings and give you access to the `rustlings` command. Run it to get started!
|
This will install Rustlings and give you access to the `rustlings` command. Run it to get started!
|
||||||
|
|
||||||
|
### Nix
|
||||||
|
|
||||||
|
Basically: Clone the repository at the latest tag, finally run `nix develop` or `nix-shell`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.1)
|
||||||
|
git clone -b 5.6.1 --depth 1 https://github.com/rust-lang/rustlings
|
||||||
|
cd rustlings
|
||||||
|
# if nix version > 2.3
|
||||||
|
nix develop
|
||||||
|
# if nix version <= 2.3
|
||||||
|
nix-shell
|
||||||
|
```
|
||||||
|
|
||||||
## Windows
|
## Windows
|
||||||
|
|
||||||
In PowerShell, set `ExecutionPolicy` to `RemoteSigned`:
|
In PowerShell (Run as Administrator), set `ExecutionPolicy` to `RemoteSigned`:
|
||||||
|
|
||||||
```ps
|
```ps1
|
||||||
Set-ExecutionPolicy RemoteSigned
|
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||||||
```
|
```
|
||||||
|
|
||||||
Then, you can run:
|
Then, you can run:
|
||||||
|
|
||||||
```ps
|
```ps1
|
||||||
Start-BitsTransfer -Source https://git.io/install-rustlings-win -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1
|
Start-BitsTransfer -Source https://raw.githubusercontent.com/rust-lang/rustlings/main/install.ps1 -Destination $env:TMP/install_rustlings.ps1; Unblock-File $env:TMP/install_rustlings.ps1; Invoke-Expression $env:TMP/install_rustlings.ps1
|
||||||
```
|
```
|
||||||
|
|
||||||
To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it.
|
To install Rustlings. Same as on MacOS/Linux, you will have access to the `rustlings` command after it. Keep in mind that this works best in PowerShell, and any other terminals may give you errors.
|
||||||
|
|
||||||
When you get a permission denied message then you have to exclude the directory where you placed the rustlings in your virus-scanner
|
If you get a permission denied message, you might have to exclude the directory where you cloned Rustlings in your antivirus.
|
||||||
|
|
||||||
## Browser:
|
## Browser
|
||||||
|
|
||||||
[Run on Repl.it](https://repl.it/github/rust-lang/rustlings)
|
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/rust-lang/rustlings)
|
||||||
|
|
||||||
[Open in Gitpod](https://gitpod.io/#https://github.com/rust-lang/rustlings)
|
[![Open Rustlings On Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/?repo=rust-lang%2Frustlings&ref=main)
|
||||||
|
|
||||||
## Manually
|
## Manually
|
||||||
|
|
||||||
Basically: Clone the repository, checkout to the latest tag, run `cargo install`.
|
Basically: Clone the repository at the latest tag, run `cargo install --path .`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/rust-lang/rustlings
|
# find out the latest version at https://github.com/rust-lang/rustlings/releases/latest (on edit 5.6.1)
|
||||||
|
git clone -b 5.6.1 --depth 1 https://github.com/rust-lang/rustlings
|
||||||
cd rustlings
|
cd rustlings
|
||||||
git checkout tags/4.3.0 # or whatever the latest version is (find out at https://github.com/rust-lang/rustlings/releases/latest)
|
|
||||||
cargo install --force --path .
|
cargo install --force --path .
|
||||||
```
|
```
|
||||||
|
|
||||||
If there are installation errors, ensure that your toolchain is up to date. For the latest, run:
|
If there are installation errors, ensure that your toolchain is up to date. For the latest, run:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
rustup update
|
rustup update
|
||||||
```
|
```
|
||||||
|
@ -97,179 +117,64 @@ In case you want to go by your own order, or want to only verify a single exerci
|
||||||
rustlings run myExercise1
|
rustlings run myExercise1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Or simply use the following command to run the next unsolved exercise in the course:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rustlings run next
|
||||||
|
```
|
||||||
|
|
||||||
In case you get stuck, you can run the following command to get a hint for your
|
In case you get stuck, you can run the following command to get a hint for your
|
||||||
exercise:
|
exercise:
|
||||||
|
|
||||||
``` bash
|
```bash
|
||||||
rustlings hint myExercise1
|
rustlings hint myExercise1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can also get the hint for the next unsolved exercise with the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rustlings hint next
|
||||||
|
```
|
||||||
|
|
||||||
|
To check your progress, you can run the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rustlings list
|
||||||
|
```
|
||||||
|
|
||||||
## Testing yourself
|
## Testing yourself
|
||||||
|
|
||||||
After every couple of sections, there will be a quiz that'll test your knowledge on a bunch of sections at once. These quizzes are found in `exercises/quizN.rs`.
|
After every couple of sections, there will be a quiz that'll test your knowledge on a bunch of sections at once. These quizzes are found in `exercises/quizN.rs`.
|
||||||
|
|
||||||
|
## Enabling `rust-analyzer`
|
||||||
|
|
||||||
|
Run the command `rustlings lsp` which will generate a `rust-project.json` at the root of the project, this allows [rust-analyzer](https://rust-analyzer.github.io/) to parse each exercise.
|
||||||
|
|
||||||
## Continuing On
|
## Continuing On
|
||||||
|
|
||||||
Once you've completed Rustlings, put your new knowledge to good use! Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to.
|
Once you've completed Rustlings, put your new knowledge to good use! Continue practicing your Rust skills by building your own projects, contributing to Rustlings, or finding other open-source projects to contribute to.
|
||||||
|
|
||||||
## Uninstalling Rustlings
|
## Uninstalling Rustlings
|
||||||
|
|
||||||
If you want to remove Rustlings from your system, there's two steps. First, you'll need to remove the exercises folder that the install script created
|
If you want to remove Rustlings from your system, there are two steps. First, you'll need to remove the exercises folder that the install script created
|
||||||
for you:
|
for you:
|
||||||
|
|
||||||
``` bash
|
```bash
|
||||||
rm -rf rustlings # or your custom folder name, if you chose and or renamed it
|
rm -rf rustlings # or your custom folder name, if you chose and or renamed it
|
||||||
```
|
```
|
||||||
|
|
||||||
Second, since Rustlings got installed via `cargo install`, it's only reasonable to assume that you can also remove it using Cargo, and
|
Second, run `cargo uninstall` to remove the `rustlings` binary:
|
||||||
exactly that is the case. Run `cargo uninstall` to remove the `rustlings` binary:
|
|
||||||
|
|
||||||
``` bash
|
```bash
|
||||||
cargo uninstall rustlings
|
cargo uninstall rustlings
|
||||||
```
|
```
|
||||||
|
|
||||||
Now you should be done!
|
Now you should be done!
|
||||||
|
|
||||||
## Completion
|
|
||||||
|
|
||||||
Rustlings isn't done; there are a couple of sections that are very experimental and don't have proper documentation. These include:
|
|
||||||
|
|
||||||
- Errors (`exercises/errors/`)
|
|
||||||
- Option (`exercises/option/`)
|
|
||||||
- Result (`exercises/result/`)
|
|
||||||
- Move Semantics (could still be improved, `exercises/move_semantics/`)
|
|
||||||
|
|
||||||
Additionally, we could use exercises on a couple of topics:
|
|
||||||
|
|
||||||
- Structs
|
|
||||||
- Better ownership stuff
|
|
||||||
- `impl`
|
|
||||||
- ??? probably more
|
|
||||||
|
|
||||||
If you are interested in improving or adding new ones, please feel free to contribute! Read on for more information :)
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
See [CONTRIBUTING.md](./CONTRIBUTING.md).
|
See [CONTRIBUTING.md](https://github.com/rust-lang/rustlings/blob/main/CONTRIBUTING.md).
|
||||||
|
|
||||||
## Contributors ✨
|
## Contributors ✨
|
||||||
|
|
||||||
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
Thanks goes to the wonderful people listed in [AUTHORS.md](https://github.com/rust-lang/rustlings/blob/main/AUTHORS.md) 🎉
|
||||||
|
|
||||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
|
||||||
<!-- prettier-ignore-start -->
|
|
||||||
<!-- markdownlint-disable -->
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="http://carol-nichols.com"><img src="https://avatars2.githubusercontent.com/u/193874?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Carol (Nichols || Goulding)</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=carols10cents" title="Code">💻</a> <a href="#content-carols10cents" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://twitter.com/QuietMisdreavus"><img src="https://avatars2.githubusercontent.com/u/5217170?v=4?s=100" width="100px;" alt=""/><br /><sub><b>QuietMisdreavus</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=QuietMisdreavus" title="Code">💻</a> <a href="#content-QuietMisdreavus" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/robertlugg"><img src="https://avatars0.githubusercontent.com/u/6054540?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Robert M Lugg</b></sub></a><br /><a href="#content-robertlugg" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://hynek.me/about/"><img src="https://avatars3.githubusercontent.com/u/41240?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hynek Schlawack</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=hynek" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://spacekookie.de"><img src="https://avatars0.githubusercontent.com/u/7669898?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Katharina Fey</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=spacekookie" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/lukabavdaz"><img src="https://avatars0.githubusercontent.com/u/9624558?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lukabavdaz</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=lukabavdaz" title="Code">💻</a> <a href="#content-lukabavdaz" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="http://vestera.as"><img src="https://avatars2.githubusercontent.com/u/4187449?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Erik Vesteraas</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=evestera" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/Delet0r"><img src="https://avatars1.githubusercontent.com/u/23195618?v=4?s=100" width="100px;" alt=""/><br /><sub><b>delet0r</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Delet0r" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="http://phinary.ca"><img src="https://avatars1.githubusercontent.com/u/10522375?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Shaun Bennett</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=shaunbennett" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/abagshaw"><img src="https://avatars2.githubusercontent.com/u/8594541?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Andrew Bagshaw</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=abagshaw" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://ai6ua.net/"><img src="https://avatars2.githubusercontent.com/u/175578?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kyle Isom</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=kisom" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/ColinPitrat"><img src="https://avatars3.githubusercontent.com/u/1541863?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Colin Pitrat</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=ColinPitrat" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://zacanger.com"><img src="https://avatars3.githubusercontent.com/u/12520493?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zac Anger</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=zacanger" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/mgeier"><img src="https://avatars1.githubusercontent.com/u/705404?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthias Geier</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=mgeier" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/cjpearce"><img src="https://avatars1.githubusercontent.com/u/3453268?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Pearce</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=cjpearce" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://yvan-sraka.github.io"><img src="https://avatars2.githubusercontent.com/u/705213?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yvan Sraka</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=yvan-sraka" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="https://github.com/dendi239"><img src="https://avatars3.githubusercontent.com/u/16478650?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Denys Smirnov</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=dendi239" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/eddyp"><img src="https://avatars2.githubusercontent.com/u/123772?v=4?s=100" width="100px;" alt=""/><br /><sub><b>eddyp</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=eddyp" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="http://about.me/BrianKung"><img src="https://avatars1.githubusercontent.com/u/2836167?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brian Kung</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=briankung" title="Code">💻</a> <a href="#content-briankung" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://rcousineau.gitlab.io"><img src="https://avatars3.githubusercontent.com/u/281039?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Russell</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=miller-time" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="http://danwilhelm.com"><img src="https://avatars3.githubusercontent.com/u/6137185?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dan Wilhelm</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=danwilhelm" title="Documentation">📖</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/Jesse-Cameron"><img src="https://avatars3.githubusercontent.com/u/3723654?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jesse</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Jesse-Cameron" title="Code">💻</a> <a href="#content-Jesse-Cameron" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/MrFroop"><img src="https://avatars3.githubusercontent.com/u/196700?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Fredrik Jambrén</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=MrFroop" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/petemcfarlane"><img src="https://avatars3.githubusercontent.com/u/3472717?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Pete McFarlane</b></sub></a><br /><a href="#content-petemcfarlane" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="https://github.com/nkanderson"><img src="https://avatars0.githubusercontent.com/u/4128825?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nkanderson</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nkanderson" title="Code">💻</a> <a href="#content-nkanderson" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/ajaxm"><img src="https://avatars0.githubusercontent.com/u/13360138?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ajax M</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=ajaxm" title="Documentation">📖</a></td>
|
|
||||||
<td align="center"><a href="https://dylnuge.com"><img src="https://avatars2.githubusercontent.com/u/118624?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dylan Nugent</b></sub></a><br /><a href="#content-Dylnuge" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/vyaslav"><img src="https://avatars0.githubusercontent.com/u/1385427?v=4?s=100" width="100px;" alt=""/><br /><sub><b>vyaslav</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=vyaslav" title="Code">💻</a> <a href="#content-vyaslav" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://join.sfxd.org"><img src="https://avatars1.githubusercontent.com/u/17297466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=gdoenlen" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/nyxtom"><img src="https://avatars2.githubusercontent.com/u/222763?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Thomas Holloway</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=nyxtom" title="Code">💻</a> <a href="#content-nyxtom" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/workingjubilee"><img src="https://avatars1.githubusercontent.com/u/46493976?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jubilee</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=workingjubilee" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/WofWca"><img src="https://avatars1.githubusercontent.com/u/39462442?v=4?s=100" width="100px;" alt=""/><br /><sub><b>WofWca</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=WofWca" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="https://github.com/jrvidal"><img src="https://avatars0.githubusercontent.com/u/1636604?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Roberto Vidal</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=jrvidal" title="Code">💻</a> <a href="https://github.com/rust-lang/rustlings/commits?author=jrvidal" title="Documentation">📖</a> <a href="#ideas-jrvidal" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-jrvidal" title="Maintenance">🚧</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/jensim"><img src="https://avatars0.githubusercontent.com/u/3663856?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jens</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=jensim" title="Documentation">📖</a></td>
|
|
||||||
<td align="center"><a href="http://rahatah.me/d"><img src="https://avatars3.githubusercontent.com/u/3174006?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rahat Ahmed</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=rahatarmanahmed" title="Documentation">📖</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/AbdouSeck"><img src="https://avatars2.githubusercontent.com/u/6490055?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Abdou Seck</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=AbdouSeck" title="Code">💻</a> <a href="#content-AbdouSeck" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/pulls?q=is%3Apr+reviewed-by%3AAbdouSeck" title="Reviewed Pull Requests">👀</a></td>
|
|
||||||
<td align="center"><a href="https://codehearts.com"><img src="https://avatars0.githubusercontent.com/u/2885412?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Katie</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=codehearts" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/Socratides"><img src="https://avatars3.githubusercontent.com/u/27732983?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Socrates</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Socratides" title="Documentation">📖</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/gnodarse"><img src="https://avatars3.githubusercontent.com/u/46761795?v=4?s=100" width="100px;" alt=""/><br /><sub><b>gnodarse</b></sub></a><br /><a href="#content-gnodarse" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/harrisonmetz"><img src="https://avatars1.githubusercontent.com/u/7883408?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Harrison Metzger</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=harrisonmetz" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="https://github.com/TorbenJ"><img src="https://avatars2.githubusercontent.com/u/9077102?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Torben Jonas</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=TorbenJ" title="Code">💻</a> <a href="#content-TorbenJ" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="http://paulbissex.com/"><img src="https://avatars0.githubusercontent.com/u/641?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Paul Bissex</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=pbx" title="Documentation">📖</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/sjmann"><img src="https://avatars0.githubusercontent.com/u/6589896?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Steven Mann</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=sjmann" title="Code">💻</a> <a href="#content-sjmann" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://smmdb.net/"><img src="https://avatars2.githubusercontent.com/u/5855071?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mario Reder</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=Tarnadas" title="Code">💻</a> <a href="#content-Tarnadas" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://keybase.io/skim"><img src="https://avatars0.githubusercontent.com/u/47347?v=4?s=100" width="100px;" alt=""/><br /><sub><b>skim</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=sl4m" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/sanjaykdragon"><img src="https://avatars1.githubusercontent.com/u/10261698?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sanjay K</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=sanjaykdragon" title="Code">💻</a> <a href="#content-sanjaykdragon" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="http://www.rohanjain.in"><img src="https://avatars1.githubusercontent.com/u/343499?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rohan Jain</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=crodjer" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://www.saidaspen.se"><img src="https://avatars1.githubusercontent.com/u/7727687?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Said Aspen</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=saidaspen" title="Code">💻</a> <a href="#content-saidaspen" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="https://github.com/uce"><img src="https://avatars3.githubusercontent.com/u/1756620?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ufuk Celebi</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=uce" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/lebedevsergey"><img src="https://avatars2.githubusercontent.com/u/7325764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lebedevsergey</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=lebedevsergey" title="Documentation">📖</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/avrong"><img src="https://avatars2.githubusercontent.com/u/6342851?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aleksei Trifonov</b></sub></a><br /><a href="#content-avrong" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://drn.ie"><img src="https://avatars2.githubusercontent.com/u/411136?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Darren Meehan</b></sub></a><br /><a href="#content-Darrenmeehan" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/jihchi"><img src="https://avatars1.githubusercontent.com/u/87983?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jihchi Lee</b></sub></a><br /><a href="#content-jihchi" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/bertonha"><img src="https://avatars3.githubusercontent.com/u/1225902?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christofer Bertonha</b></sub></a><br /><a href="#content-bertonha" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/apatniv"><img src="https://avatars2.githubusercontent.com/u/22565917?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Vivek Bharath Akupatni</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=apatniv" title="Code">💻</a> <a href="https://github.com/rust-lang/rustlings/commits?author=apatniv" title="Tests">⚠️</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/DiD92"><img src="https://avatars3.githubusercontent.com/u/6002416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dídac Sementé Fernández</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=DiD92" title="Code">💻</a> <a href="#content-DiD92" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="https://github.com/wrobstory"><img src="https://avatars3.githubusercontent.com/u/2601457?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rob Story</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=wrobstory" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/siobhanjacobson"><img src="https://avatars2.githubusercontent.com/u/28983835?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Siobhan Jacobson</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=siobhanjacobson" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://www.linkedin.com/in/evancarroll/"><img src="https://avatars2.githubusercontent.com/u/19922?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Evan Carroll</b></sub></a><br /><a href="#content-EvanCarroll" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="http://www.jawaadmahmood.com"><img src="https://avatars3.githubusercontent.com/u/95606?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jawaad Mahmood</b></sub></a><br /><a href="#content-jmahmood" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/GaurangTandon"><img src="https://avatars1.githubusercontent.com/u/6308683?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gaurang Tandon</b></sub></a><br /><a href="#content-GaurangTandon" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/dev-cyprium"><img src="https://avatars1.githubusercontent.com/u/6002628?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Stefan Kupresak</b></sub></a><br /><a href="#content-dev-cyprium" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/greg-el"><img src="https://avatars3.githubusercontent.com/u/45019882?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Greg Leonard</b></sub></a><br /><a href="#content-greg-el" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://ryanpcmcquen.org"><img src="https://avatars3.githubusercontent.com/u/772937?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ryan McQuen</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=ryanpcmcquen" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="https://github.com/AnnikaCodes"><img src="https://avatars3.githubusercontent.com/u/56906084?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Annika</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/pulls?q=is%3Apr+reviewed-by%3AAnnikaCodes" title="Reviewed Pull Requests">👀</a></td>
|
|
||||||
<td align="center"><a href="https://darnuria.eu"><img src="https://avatars1.githubusercontent.com/u/2827553?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Axel Viala</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=darnuria" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://sazid.github.io"><img src="https://avatars1.githubusercontent.com/u/2370167?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mohammed Sazid Al Rashid</b></sub></a><br /><a href="#content-sazid" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/commits?author=sazid" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://codingthemsoftly.com"><img src="https://avatars1.githubusercontent.com/u/17479099?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Caleb Webber</b></sub></a><br /><a href="#maintenance-seeplusplus" title="Maintenance">🚧</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/pcn"><img src="https://avatars2.githubusercontent.com/u/1056756?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Peter N</b></sub></a><br /><a href="#maintenance-pcn" title="Maintenance">🚧</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/seancad"><img src="https://avatars1.githubusercontent.com/u/47405611?v=4?s=100" width="100px;" alt=""/><br /><sub><b>seancad</b></sub></a><br /><a href="#maintenance-seancad" title="Maintenance">🚧</a></td>
|
|
||||||
<td align="center"><a href="http://willhayworth.com"><img src="https://avatars3.githubusercontent.com/u/181174?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Will Hayworth</b></sub></a><br /><a href="#content-wsh" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/chrizel"><img src="https://avatars3.githubusercontent.com/u/20802?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Zeller</b></sub></a><br /><a href="#content-chrizel" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="https://github.com/jfchevrette"><img src="https://avatars.githubusercontent.com/u/3001?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jean-Francois Chevrette</b></sub></a><br /><a href="#content-jfchevrette" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/commits?author=jfchevrette" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/jbaber"><img src="https://avatars.githubusercontent.com/u/1908117?v=4?s=100" width="100px;" alt=""/><br /><sub><b>John Baber-Lucero</b></sub></a><br /><a href="#content-jbaber" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/tal-zvon"><img src="https://avatars.githubusercontent.com/u/3195851?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tal</b></sub></a><br /><a href="#content-tal-zvon" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/apogeeoak"><img src="https://avatars.githubusercontent.com/u/59737221?v=4?s=100" width="100px;" alt=""/><br /><sub><b>apogeeoak</b></sub></a><br /><a href="#content-apogeeoak" title="Content">🖋</a> <a href="https://github.com/rust-lang/rustlings/commits?author=apogeeoak" title="Code">💻</a></td>
|
|
||||||
<td align="center"><a href="http://www.garfieldtech.com/"><img src="https://avatars.githubusercontent.com/u/254863?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Larry Garfield</b></sub></a><br /><a href="#content-Crell" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/circumspect"><img src="https://avatars.githubusercontent.com/u/40770208?v=4?s=100" width="100px;" alt=""/><br /><sub><b>circumspect</b></sub></a><br /><a href="#content-circumspect" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/cjwyett"><img src="https://avatars.githubusercontent.com/u/34195737?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cyrus Wyett</b></sub></a><br /><a href="#content-cjwyett" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/cadolphs"><img src="https://avatars.githubusercontent.com/u/13894820?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cadolphs</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=cadolphs" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><a href="https://www.haveneer.com"><img src="https://avatars.githubusercontent.com/u/26146722?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Pascal H.</b></sub></a><br /><a href="#content-hpwxf" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://twitter.com/chapeupreto"><img src="https://avatars.githubusercontent.com/u/834048?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rod Elias</b></sub></a><br /><a href="#content-chapeupreto" title="Content">🖋</a></td>
|
|
||||||
<td align="center"><a href="https://github.com/blerchy"><img src="https://avatars.githubusercontent.com/u/2555355?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matt Lebl</b></sub></a><br /><a href="https://github.com/rust-lang/rustlings/commits?author=blerchy" title="Code">💻</a></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<!-- markdownlint-restore -->
|
|
||||||
<!-- prettier-ignore-end -->
|
|
||||||
|
|
||||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
|
||||||
|
|
||||||
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
Thanks for installing Rustlings!
|
|
||||||
|
|
||||||
Is this your first time? Don't worry, Rustlings was made for beginners! We are
|
|
||||||
going to teach you a lot of things about Rust, but before we can get
|
|
||||||
started, here's a couple of notes about how Rustlings operates:
|
|
||||||
|
|
||||||
1. The central concept behind Rustlings is that you solve exercises. These
|
|
||||||
exercises usually have some sort of syntax error in them, which will cause
|
|
||||||
them to fail compilation or testing. Sometimes there's a logic error instead
|
|
||||||
of a syntax error. No matter what error, it's your job to find it and fix it!
|
|
||||||
You'll know when you fixed it because then, the exercise will compile and
|
|
||||||
Rustlings will be able to move on to the next exercise.
|
|
||||||
2. If you run Rustlings in watch mode (which we recommend), it'll automatically
|
|
||||||
start with the first exercise. Don't get confused by an error message popping
|
|
||||||
up as soon as you run Rustlings! This is part of the exercise that you're
|
|
||||||
supposed to solve, so open the exercise file in an editor and start your
|
|
||||||
detective work!
|
|
||||||
3. If you're stuck on an exercise, there is a helpful hint you can view by typing
|
|
||||||
'hint' (in watch mode), or running `rustlings hint myexercise`.
|
|
||||||
4. If an exercise doesn't make sense to you, feel free to open an issue on GitHub!
|
|
||||||
(https://github.com/rust-lang/rustlings/issues/new). We look at every issue,
|
|
||||||
and sometimes, other learners do too so you can help each other out!
|
|
||||||
|
|
||||||
Got all that? Great! To get started, run `rustlings watch` in order to get the first
|
|
||||||
exercise. Make sure to have your editor open!
|
|
|
@ -1,24 +1,27 @@
|
||||||
# Exercise to Book Chapter mapping
|
# Exercise to Book Chapter mapping
|
||||||
|
|
||||||
| Exercise | Book Chapter |
|
| Exercise | Book Chapter |
|
||||||
|------------------------|--------------|
|
| ---------------------- | ------------------- |
|
||||||
| variables | §3.1 |
|
| variables | §3.1 |
|
||||||
| functions | §3.3 |
|
| functions | §3.3 |
|
||||||
| if | §3.5 |
|
| if | §3.5 |
|
||||||
| move_semantics | §4.1 |
|
| primitive_types | §3.2, §4.3 |
|
||||||
| primitive_types | §4.3 |
|
| vecs | §8.1 |
|
||||||
| structs | §5.1 |
|
| move_semantics | §4.1-2 |
|
||||||
| enums | §6 |
|
| structs | §5.1, §5.3 |
|
||||||
| modules | §7.2 |
|
| enums | §6, §18.3 |
|
||||||
| collections | §8.1 |
|
| strings | §8.2 |
|
||||||
| strings | §8.2 |
|
| modules | §7 |
|
||||||
| error_handling | §9 |
|
| hashmaps | §8.3 |
|
||||||
| generics | §10 |
|
| options | §10.1 |
|
||||||
| option | §10.1 |
|
| error_handling | §9 |
|
||||||
| traits | §10.2 |
|
| generics | §10 |
|
||||||
| tests | §11.1 |
|
| traits | §10.2 |
|
||||||
| standard_library_types | §13.2 |
|
| tests | §11.1 |
|
||||||
| threads | §16.1 |
|
| lifetimes | §10.3 |
|
||||||
| macros | §19.6 |
|
| iterators | §13.2-4 |
|
||||||
| clippy | n/a |
|
| threads | §16.1-3 |
|
||||||
| conversions | n/a |
|
| smart_pointers | §15, §16.3 |
|
||||||
|
| macros | §19.6 |
|
||||||
|
| clippy | §21.4 |
|
||||||
|
| conversions | n/a |
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
### Clippy
|
# Clippy
|
||||||
|
|
||||||
The Clippy tool is a collection of lints to analyze your code so you can catch common mistakes and improve your Rust code.
|
The Clippy tool is a collection of lints to analyze your code so you can catch common mistakes and improve your Rust code.
|
||||||
|
|
||||||
If you used the installation script for Rustlings, Clippy should be already installed.
|
If you used the installation script for Rustlings, Clippy should be already installed.
|
||||||
If not you can install it manually via `rustup component add clippy`.
|
If not you can install it manually via `rustup component add clippy`.
|
||||||
|
|
||||||
For more information about Clippy lints, please see [their documentation page](https://rust-lang.github.io/rust-clippy/master/).
|
## Further information
|
||||||
|
|
||||||
|
- [GitHub Repository](https://github.com/rust-lang/rust-clippy).
|
||||||
|
|
|
@ -1,17 +1,26 @@
|
||||||
// clippy1.rs
|
// clippy1.rs
|
||||||
// The Clippy tool is a collection of lints to analyze your code
|
|
||||||
// so you can catch common mistakes and improve your Rust code.
|
|
||||||
//
|
//
|
||||||
// For these exercises the code will fail to compile when there are clippy warnings
|
// The Clippy tool is a collection of lints to analyze your code so you can
|
||||||
// check clippy's suggestions from the output to solve the exercise.
|
// catch common mistakes and improve your Rust code.
|
||||||
// Execute `rustlings hint clippy1` for hints :)
|
//
|
||||||
|
// For these exercises the code will fail to compile when there are clippy
|
||||||
|
// warnings check clippy's suggestions from the output to solve the exercise.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint clippy1` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
use std::f32;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = 1.2331f64;
|
let pi = 3.14f32;
|
||||||
let y = 1.2332f64;
|
let radius = 5.00f32;
|
||||||
if y != x {
|
|
||||||
println!("Success!");
|
let area = pi * f32::powi(radius, 2);
|
||||||
}
|
|
||||||
|
println!(
|
||||||
|
"The area of a circle with radius {:.2} is {:.5}!",
|
||||||
|
radius, area
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// clippy2.rs
|
// clippy2.rs
|
||||||
// Make me compile! Execute `rustlings hint clippy2` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint clippy2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
// clippy3.rs
|
||||||
|
//
|
||||||
|
// Here's a couple more easy Clippy fixes, so you can see its utility.
|
||||||
|
// No hints.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
#[allow(unused_variables, unused_assignments)]
|
||||||
|
fn main() {
|
||||||
|
let my_option: Option<()> = None;
|
||||||
|
if my_option.is_none() {
|
||||||
|
my_option.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
let my_arr = &[
|
||||||
|
-1, -2, -3
|
||||||
|
-4, -5, -6
|
||||||
|
];
|
||||||
|
println!("My array! Here it is: {:?}", my_arr);
|
||||||
|
|
||||||
|
let my_empty_vec = vec![1, 2, 3, 4, 5].resize(0, 5);
|
||||||
|
println!("This Vec is empty, see? {:?}", my_empty_vec);
|
||||||
|
|
||||||
|
let mut value_a = 45;
|
||||||
|
let mut value_b = 66;
|
||||||
|
// Let's swap these two!
|
||||||
|
value_a = value_b;
|
||||||
|
value_b = value_a;
|
||||||
|
println!("value a: {}; value b: {}", value_a, value_b);
|
||||||
|
}
|
|
@ -1,20 +0,0 @@
|
||||||
### Collections
|
|
||||||
|
|
||||||
Rust’s standard library includes a number of very useful data
|
|
||||||
structures called collections. Most other data types represent one
|
|
||||||
specific value, but collections can contain multiple values. Unlike
|
|
||||||
the built-in array and tuple types, the data these collections point
|
|
||||||
to is stored on the heap, which means the amount of data does not need
|
|
||||||
to be known at compile time and can grow or shrink as the program
|
|
||||||
runs.
|
|
||||||
|
|
||||||
This exercise will get you familiar with two fundamental data
|
|
||||||
structures that are used very often in Rust programs:
|
|
||||||
|
|
||||||
* A *vector* allows you to store a variable number of values next to
|
|
||||||
each other.
|
|
||||||
* A *hash map* allows you to associate a value with a particular key.
|
|
||||||
You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map),
|
|
||||||
[*dictionary* in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) or an *associative array* in other languages.
|
|
||||||
|
|
||||||
[Rust book chapter](https://doc.rust-lang.org/stable/book/ch08-01-vectors.html)
|
|
|
@ -1,83 +0,0 @@
|
||||||
// hashmap2.rs
|
|
||||||
|
|
||||||
// A basket of fruits in the form of a hash map is given. The key
|
|
||||||
// represents the name of the fruit and the value represents how many
|
|
||||||
// of that particular fruit is in the basket. You have to put *MORE
|
|
||||||
// THAN 11* fruits in the basket. Three types of fruits - Apple (4),
|
|
||||||
// Mango (2) and Lichi (5) are already given in the basket. You are
|
|
||||||
// not allowed to insert any more of these fruits!
|
|
||||||
//
|
|
||||||
// Make me pass the tests!
|
|
||||||
//
|
|
||||||
// Execute the command `rustlings hint collections4` if you need
|
|
||||||
// hints.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
use std::collections::HashMap;
|
|
||||||
|
|
||||||
#[derive(Hash, PartialEq, Eq)]
|
|
||||||
enum Fruit {
|
|
||||||
Apple,
|
|
||||||
Banana,
|
|
||||||
Mango,
|
|
||||||
Lichi,
|
|
||||||
Pineapple,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn fruit_basket(basket: &mut HashMap<Fruit, u32>) {
|
|
||||||
let fruit_kinds = vec![
|
|
||||||
Fruit::Apple,
|
|
||||||
Fruit::Banana,
|
|
||||||
Fruit::Mango,
|
|
||||||
Fruit::Lichi,
|
|
||||||
Fruit::Pineapple,
|
|
||||||
];
|
|
||||||
|
|
||||||
for fruit in fruit_kinds {
|
|
||||||
// TODO: Put new fruits if not already present. Note that you
|
|
||||||
// are not allowed to put any type of fruit that's already
|
|
||||||
// present!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
fn get_fruit_basket() -> HashMap<Fruit, u32> {
|
|
||||||
let mut basket = HashMap::<Fruit, u32>::new();
|
|
||||||
basket.insert(Fruit::Apple, 4);
|
|
||||||
basket.insert(Fruit::Mango, 2);
|
|
||||||
basket.insert(Fruit::Lichi, 5);
|
|
||||||
|
|
||||||
basket
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_given_fruits_are_not_modified() {
|
|
||||||
let mut basket = get_fruit_basket();
|
|
||||||
fruit_basket(&mut basket);
|
|
||||||
assert_eq!(*basket.get(&Fruit::Apple).unwrap(), 4);
|
|
||||||
assert_eq!(*basket.get(&Fruit::Mango).unwrap(), 2);
|
|
||||||
assert_eq!(*basket.get(&Fruit::Lichi).unwrap(), 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn at_least_five_types_of_fruits() {
|
|
||||||
let mut basket = get_fruit_basket();
|
|
||||||
fruit_basket(&mut basket);
|
|
||||||
let count_fruit_kinds = basket.len();
|
|
||||||
assert!(count_fruit_kinds == 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn greater_than_eleven_fruits() {
|
|
||||||
let mut basket = get_fruit_basket();
|
|
||||||
fruit_basket(&mut basket);
|
|
||||||
let count = basket
|
|
||||||
.values()
|
|
||||||
.sum::<u32>();
|
|
||||||
assert!(count > 11);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
// vec2.rs
|
|
||||||
// A Vec of even numbers is given. Your task is to complete the loop
|
|
||||||
// so that each number in the Vec is multiplied by 2.
|
|
||||||
//
|
|
||||||
// Make me pass the test!
|
|
||||||
//
|
|
||||||
// Execute the command `rustlings hint collections2` if you need
|
|
||||||
// hints.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn vec_loop(mut v: Vec<i32>) -> Vec<i32> {
|
|
||||||
for i in v.iter_mut() {
|
|
||||||
// TODO: Fill this up so that each element in the Vec `v` is
|
|
||||||
// multiplied by 2.
|
|
||||||
}
|
|
||||||
|
|
||||||
// At this point, `v` should be equal to [4, 8, 12, 16, 20].
|
|
||||||
v
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_vec_loop() {
|
|
||||||
let v: Vec<i32> = (1..).filter(|x| x % 2 == 0).take(5).collect();
|
|
||||||
let ans = vec_loop(v.clone());
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
ans,
|
|
||||||
v.iter()
|
|
||||||
.map(|x| x * 2)
|
|
||||||
.collect::<Vec<i32>>()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,4 @@
|
||||||
### Type conversions
|
# Type conversions
|
||||||
|
|
||||||
|
|
||||||
Rust offers a multitude of ways to convert a value of a given type into another type.
|
Rust offers a multitude of ways to convert a value of a given type into another type.
|
||||||
|
|
||||||
|
@ -7,6 +6,7 @@ The simplest form of type conversion is a type cast expression. It is denoted wi
|
||||||
|
|
||||||
Rust also offers traits that facilitate type conversions upon implementation. These traits can be found under the [`convert`](https://doc.rust-lang.org/std/convert/index.html) module.
|
Rust also offers traits that facilitate type conversions upon implementation. These traits can be found under the [`convert`](https://doc.rust-lang.org/std/convert/index.html) module.
|
||||||
The traits are the following:
|
The traits are the following:
|
||||||
|
|
||||||
- `From` and `Into` covered in [`from_into`](from_into.rs)
|
- `From` and `Into` covered in [`from_into`](from_into.rs)
|
||||||
- `TryFrom` and `TryInto` covered in [`try_from_into`](try_from_into.rs)
|
- `TryFrom` and `TryInto` covered in [`try_from_into`](try_from_into.rs)
|
||||||
- `AsRef` and `AsMut` covered in [`as_ref_mut`](as_ref_mut.rs)
|
- `AsRef` and `AsMut` covered in [`as_ref_mut`](as_ref_mut.rs)
|
||||||
|
@ -15,6 +15,9 @@ Furthermore, the `std::str` module offers a trait called [`FromStr`](https://doc
|
||||||
|
|
||||||
These should be the main ways ***within the standard library*** to convert data into your desired types.
|
These should be the main ways ***within the standard library*** to convert data into your desired types.
|
||||||
|
|
||||||
#### Book Sections
|
## Further information
|
||||||
|
|
||||||
These are not directly covered in the book, but the standard library has great documentation for [conversions here](https://doc.rust-lang.org/std/convert/index.html). The `FromStr` trait is also covered [here](https://doc.rust-lang.org/std/str/trait.FromStr.html).
|
These are not directly covered in the book, but the standard library has a great documentation for it.
|
||||||
|
|
||||||
|
- [conversions](https://doc.rust-lang.org/std/convert/index.html)
|
||||||
|
- [`FromStr` trait](https://doc.rust-lang.org/std/str/trait.FromStr.html)
|
||||||
|
|
|
@ -1,25 +1,31 @@
|
||||||
// AsRef and AsMut allow for cheap reference-to-reference conversions.
|
// as_ref_mut.rs
|
||||||
// Read more about them at https://doc.rust-lang.org/std/convert/trait.AsRef.html
|
//
|
||||||
// and https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively.
|
// AsRef and AsMut allow for cheap reference-to-reference conversions. Read more
|
||||||
|
// about them at https://doc.rust-lang.org/std/convert/trait.AsRef.html and
|
||||||
|
// https://doc.rust-lang.org/std/convert/trait.AsMut.html, respectively.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint as_ref_mut` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
// Obtain the number of bytes (not characters) in the given argument
|
// Obtain the number of bytes (not characters) in the given argument.
|
||||||
// Add the AsRef trait appropriately as a trait bound
|
// TODO: Add the AsRef trait appropriately as a trait bound.
|
||||||
fn byte_counter<T>(arg: T) -> usize {
|
fn byte_counter<T>(arg: T) -> usize {
|
||||||
arg.as_ref().as_bytes().len()
|
arg.as_ref().as_bytes().len()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Obtain the number of characters (not bytes) in the given argument
|
// Obtain the number of characters (not bytes) in the given argument.
|
||||||
// Add the AsRef trait appropriately as a trait bound
|
// TODO: Add the AsRef trait appropriately as a trait bound.
|
||||||
fn char_counter<T>(arg: T) -> usize {
|
fn char_counter<T>(arg: T) -> usize {
|
||||||
arg.as_ref().chars().count()
|
arg.as_ref().chars().count()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
// Squares a number using as_mut().
|
||||||
let s = "Café au lait";
|
// TODO: Add the appropriate trait bound.
|
||||||
println!("{}", char_counter(s));
|
fn num_sq<T>(arg: &mut T) {
|
||||||
println!("{}", byte_counter(s));
|
// TODO: Implement the function body.
|
||||||
|
???
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -49,4 +55,11 @@ mod tests {
|
||||||
let s = String::from("Cafe au lait");
|
let s = String::from("Cafe au lait");
|
||||||
assert_eq!(char_counter(s.clone()), byte_counter(s));
|
assert_eq!(char_counter(s.clone()), byte_counter(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn mut_box() {
|
||||||
|
let mut num: Box<u32> = Box::new(3);
|
||||||
|
num_sq(&mut num);
|
||||||
|
assert_eq!(*num, 9);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
// The From trait is used for value-to-value conversions.
|
// from_into.rs
|
||||||
// If From is implemented correctly for a type, the Into trait should work conversely.
|
//
|
||||||
// You can read more about it at https://doc.rust-lang.org/std/convert/trait.From.html
|
// The From trait is used for value-to-value conversions. If From is implemented
|
||||||
|
// correctly for a type, the Into trait should work conversely. You can read
|
||||||
|
// more about it at https://doc.rust-lang.org/std/convert/trait.From.html
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint from_into` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Person {
|
struct Person {
|
||||||
name: String,
|
name: String,
|
||||||
|
@ -18,20 +24,21 @@ impl Default for Person {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Your task is to complete this implementation
|
// Your task is to complete this implementation in order for the line `let p =
|
||||||
// in order for the line `let p = Person::from("Mark,20")` to compile
|
// Person::from("Mark,20")` to compile Please note that you'll need to parse the
|
||||||
// Please note that you'll need to parse the age component into a `usize`
|
// age component into a `usize` with something like `"4".parse::<usize>()`. The
|
||||||
// with something like `"4".parse::<usize>()`. The outcome of this needs to
|
// outcome of this needs to be handled appropriately.
|
||||||
// be handled appropriately.
|
|
||||||
//
|
//
|
||||||
// Steps:
|
// Steps:
|
||||||
// 1. If the length of the provided string is 0, then return the default of Person
|
// 1. If the length of the provided string is 0, then return the default of
|
||||||
// 2. Split the given string on the commas present in it
|
// Person.
|
||||||
// 3. Extract the first element from the split operation and use it as the name
|
// 2. Split the given string on the commas present in it.
|
||||||
// 4. If the name is empty, then return the default of Person
|
// 3. Extract the first element from the split operation and use it as the name.
|
||||||
// 5. Extract the other element from the split operation and parse it into a `usize` as the age
|
// 4. If the name is empty, then return the default of Person.
|
||||||
// If while parsing the age, something goes wrong, then return the default of Person
|
// 5. Extract the other element from the split operation and parse it into a
|
||||||
// Otherwise, then return an instantiated Person object with the results
|
// `usize` as the age.
|
||||||
|
// If while parsing the age, something goes wrong, then return the default of
|
||||||
|
// Person Otherwise, then return an instantiated Person object with the results
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
@ -75,7 +82,8 @@ mod tests {
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_bad_age() {
|
fn test_bad_age() {
|
||||||
// Test that "Mark,twenty" will return the default person due to an error in parsing age
|
// Test that "Mark,twenty" will return the default person due to an
|
||||||
|
// error in parsing age
|
||||||
let p = Person::from("Mark,twenty");
|
let p = Person::from("Mark,twenty");
|
||||||
assert_eq!(p.name, "John");
|
assert_eq!(p.name, "John");
|
||||||
assert_eq!(p.age, 30);
|
assert_eq!(p.age, 30);
|
||||||
|
@ -119,14 +127,14 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_trailing_comma() {
|
fn test_trailing_comma() {
|
||||||
let p: Person = Person::from("Mike,32,");
|
let p: Person = Person::from("Mike,32,");
|
||||||
assert_eq!(p.name, "John");
|
assert_eq!(p.name, "Mike");
|
||||||
assert_eq!(p.age, 30);
|
assert_eq!(p.age, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_trailing_comma_and_some_string() {
|
fn test_trailing_comma_and_some_string() {
|
||||||
let p: Person = Person::from("Mike,32,man");
|
let p: Person = Person::from("Mike,32,man");
|
||||||
assert_eq!(p.name, "John");
|
assert_eq!(p.name, "Mike");
|
||||||
assert_eq!(p.age, 30);
|
assert_eq!(p.age, 32);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,29 +1,56 @@
|
||||||
// This does practically the same thing that TryFrom<&str> does.
|
// from_str.rs
|
||||||
// Additionally, upon implementing FromStr, you can use the `parse` method
|
//
|
||||||
// on strings to generate an object of the implementor type.
|
// This is similar to from_into.rs, but this time we'll implement `FromStr` and
|
||||||
// You can read more about it at https://doc.rust-lang.org/std/str/trait.FromStr.html
|
// return errors instead of falling back to a default value. Additionally, upon
|
||||||
|
// implementing FromStr, you can use the `parse` method on strings to generate
|
||||||
|
// an object of the implementor type. You can read more about it at
|
||||||
|
// https://doc.rust-lang.org/std/str/trait.FromStr.html
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint from_str` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
use std::num::ParseIntError;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, PartialEq)]
|
||||||
struct Person {
|
struct Person {
|
||||||
name: String,
|
name: String,
|
||||||
age: usize,
|
age: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We will use this error type for the `FromStr` implementation.
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
enum ParsePersonError {
|
||||||
|
// Empty input string
|
||||||
|
Empty,
|
||||||
|
// Incorrect number of fields
|
||||||
|
BadLen,
|
||||||
|
// Empty name field
|
||||||
|
NoName,
|
||||||
|
// Wrapped error from parse::<usize>()
|
||||||
|
ParseInt(ParseIntError),
|
||||||
|
}
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
// Steps:
|
// Steps:
|
||||||
// 1. If the length of the provided string is 0, an error should be returned
|
// 1. If the length of the provided string is 0, an error should be returned
|
||||||
// 2. Split the given string on the commas present in it
|
// 2. Split the given string on the commas present in it
|
||||||
// 3. Only 2 elements should be returned from the split, otherwise return an error
|
// 3. Only 2 elements should be returned from the split, otherwise return an
|
||||||
|
// error
|
||||||
// 4. Extract the first element from the split operation and use it as the name
|
// 4. Extract the first element from the split operation and use it as the name
|
||||||
// 5. Extract the other element from the split operation and parse it into a `usize` as the age
|
// 5. Extract the other element from the split operation and parse it into a
|
||||||
// with something like `"4".parse::<usize>()`
|
// `usize` as the age with something like `"4".parse::<usize>()`
|
||||||
// 5. If while extracting the name and the age something goes wrong, an error should be returned
|
// 6. If while extracting the name and the age something goes wrong, an error
|
||||||
|
// should be returned
|
||||||
// If everything goes well, then return a Result of a Person object
|
// If everything goes well, then return a Result of a Person object
|
||||||
|
//
|
||||||
|
// As an aside: `Box<dyn Error>` implements `From<&'_ str>`. This means that if
|
||||||
|
// you want to return a string error message, you can do so via just using
|
||||||
|
// return `Err("my error message".into())`.
|
||||||
|
|
||||||
impl FromStr for Person {
|
impl FromStr for Person {
|
||||||
type Err = String;
|
type Err = ParsePersonError;
|
||||||
fn from_str(s: &str) -> Result<Person, Self::Err> {
|
fn from_str(s: &str) -> Result<Person, Self::Err> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,7 +66,7 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn empty_input() {
|
fn empty_input() {
|
||||||
assert!("".parse::<Person>().is_err());
|
assert_eq!("".parse::<Person>(), Err(ParsePersonError::Empty));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn good_input() {
|
fn good_input() {
|
||||||
|
@ -51,41 +78,56 @@ mod tests {
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn missing_age() {
|
fn missing_age() {
|
||||||
assert!("John,".parse::<Person>().is_err());
|
assert!(matches!(
|
||||||
|
"John,".parse::<Person>(),
|
||||||
|
Err(ParsePersonError::ParseInt(_))
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn invalid_age() {
|
fn invalid_age() {
|
||||||
assert!("John,twenty".parse::<Person>().is_err());
|
assert!(matches!(
|
||||||
|
"John,twenty".parse::<Person>(),
|
||||||
|
Err(ParsePersonError::ParseInt(_))
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn missing_comma_and_age() {
|
fn missing_comma_and_age() {
|
||||||
assert!("John".parse::<Person>().is_err());
|
assert_eq!("John".parse::<Person>(), Err(ParsePersonError::BadLen));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn missing_name() {
|
fn missing_name() {
|
||||||
assert!(",1".parse::<Person>().is_err());
|
assert_eq!(",1".parse::<Person>(), Err(ParsePersonError::NoName));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn missing_name_and_age() {
|
fn missing_name_and_age() {
|
||||||
assert!(",".parse::<Person>().is_err());
|
assert!(matches!(
|
||||||
|
",".parse::<Person>(),
|
||||||
|
Err(ParsePersonError::NoName | ParsePersonError::ParseInt(_))
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn missing_name_and_invalid_age() {
|
fn missing_name_and_invalid_age() {
|
||||||
assert!(",one".parse::<Person>().is_err());
|
assert!(matches!(
|
||||||
|
",one".parse::<Person>(),
|
||||||
|
Err(ParsePersonError::NoName | ParsePersonError::ParseInt(_))
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn trailing_comma() {
|
fn trailing_comma() {
|
||||||
assert!("John,32,".parse::<Person>().is_err());
|
assert_eq!("John,32,".parse::<Person>(), Err(ParsePersonError::BadLen));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn trailing_comma_and_some_string() {
|
fn trailing_comma_and_some_string() {
|
||||||
assert!("John,32,man".parse::<Person>().is_err());
|
assert_eq!(
|
||||||
|
"John,32,man".parse::<Person>(),
|
||||||
|
Err(ParsePersonError::BadLen)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
// TryFrom is a simple and safe type conversion that may fail in a controlled way under some circumstances.
|
// try_from_into.rs
|
||||||
// Basically, this is the same as From. The main difference is that this should return a Result type
|
//
|
||||||
// instead of the target type itself.
|
// TryFrom is a simple and safe type conversion that may fail in a controlled
|
||||||
// You can read more about it at https://doc.rust-lang.org/std/convert/trait.TryFrom.html
|
// way under some circumstances. Basically, this is the same as From. The main
|
||||||
|
// difference is that this should return a Result type instead of the target
|
||||||
|
// type itself. You can read more about it at
|
||||||
|
// https://doc.rust-lang.org/std/convert/trait.TryFrom.html
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint try_from_into` or use the `hint` watch subcommand for
|
||||||
|
// a hint.
|
||||||
|
|
||||||
use std::convert::{TryFrom, TryInto};
|
use std::convert::{TryFrom, TryInto};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
|
@ -11,49 +18,60 @@ struct Color {
|
||||||
blue: u8,
|
blue: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We will use this error type for these `TryFrom` conversions.
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
enum IntoColorError {
|
||||||
|
// Incorrect length of slice
|
||||||
|
BadLen,
|
||||||
|
// Integer conversion error
|
||||||
|
IntConversion,
|
||||||
|
}
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
// Your task is to complete this implementation
|
// Your task is to complete this implementation and return an Ok result of inner
|
||||||
// and return an Ok result of inner type Color.
|
// type Color. You need to create an implementation for a tuple of three
|
||||||
// You need to create an implementation for a tuple of three integers,
|
// integers, an array of three integers, and a slice of integers.
|
||||||
// an array of three integers and a slice of integers.
|
|
||||||
//
|
//
|
||||||
// Note that the implementation for tuple and array will be checked at compile time,
|
// Note that the implementation for tuple and array will be checked at compile
|
||||||
// but the slice implementation needs to check the slice length!
|
// time, but the slice implementation needs to check the slice length! Also note
|
||||||
// Also note that correct RGB color values must be integers in the 0..=255 range.
|
// that correct RGB color values must be integers in the 0..=255 range.
|
||||||
|
|
||||||
// Tuple implementation
|
// Tuple implementation
|
||||||
impl TryFrom<(i16, i16, i16)> for Color {
|
impl TryFrom<(i16, i16, i16)> for Color {
|
||||||
type Error = String;
|
type Error = IntoColorError;
|
||||||
fn try_from(tuple: (i16, i16, i16)) -> Result<Self, Self::Error> {}
|
fn try_from(tuple: (i16, i16, i16)) -> Result<Self, Self::Error> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Array implementation
|
// Array implementation
|
||||||
impl TryFrom<[i16; 3]> for Color {
|
impl TryFrom<[i16; 3]> for Color {
|
||||||
type Error = String;
|
type Error = IntoColorError;
|
||||||
fn try_from(arr: [i16; 3]) -> Result<Self, Self::Error> {}
|
fn try_from(arr: [i16; 3]) -> Result<Self, Self::Error> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Slice implementation
|
// Slice implementation
|
||||||
impl TryFrom<&[i16]> for Color {
|
impl TryFrom<&[i16]> for Color {
|
||||||
type Error = String;
|
type Error = IntoColorError;
|
||||||
fn try_from(slice: &[i16]) -> Result<Self, Self::Error> {}
|
fn try_from(slice: &[i16]) -> Result<Self, Self::Error> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// Use the `from` function
|
// Use the `try_from` function
|
||||||
let c1 = Color::try_from((183, 65, 14));
|
let c1 = Color::try_from((183, 65, 14));
|
||||||
println!("{:?}", c1);
|
println!("{:?}", c1);
|
||||||
|
|
||||||
// Since From is implemented for Color, we should be able to use Into
|
// Since TryFrom is implemented for Color, we should be able to use TryInto
|
||||||
let c2: Result<Color, _> = [183, 65, 14].try_into();
|
let c2: Result<Color, _> = [183, 65, 14].try_into();
|
||||||
println!("{:?}", c2);
|
println!("{:?}", c2);
|
||||||
|
|
||||||
let v = vec![183, 65, 14];
|
let v = vec![183, 65, 14];
|
||||||
// With slice we should use `from` function
|
// With slice we should use `try_from` function
|
||||||
let c3 = Color::try_from(&v[..]);
|
let c3 = Color::try_from(&v[..]);
|
||||||
println!("{:?}", c3);
|
println!("{:?}", c3);
|
||||||
// or take slice within round brackets and use Into
|
// or take slice within round brackets and use TryInto
|
||||||
let c4: Result<Color, _> = (&v[..]).try_into();
|
let c4: Result<Color, _> = (&v[..]).try_into();
|
||||||
println!("{:?}", c4);
|
println!("{:?}", c4);
|
||||||
}
|
}
|
||||||
|
@ -64,91 +82,112 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_out_of_range_positive() {
|
fn test_tuple_out_of_range_positive() {
|
||||||
assert!(Color::try_from((256, 1000, 10000)).is_err());
|
assert_eq!(
|
||||||
|
Color::try_from((256, 1000, 10000)),
|
||||||
|
Err(IntoColorError::IntConversion)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_out_of_range_negative() {
|
fn test_tuple_out_of_range_negative() {
|
||||||
assert!(Color::try_from((-1, -10, -256)).is_err());
|
assert_eq!(
|
||||||
|
Color::try_from((-1, -10, -256)),
|
||||||
|
Err(IntoColorError::IntConversion)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_sum() {
|
fn test_tuple_sum() {
|
||||||
assert!(Color::try_from((-1, 255, 255)).is_err());
|
assert_eq!(
|
||||||
|
Color::try_from((-1, 255, 255)),
|
||||||
|
Err(IntoColorError::IntConversion)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_tuple_correct() {
|
fn test_tuple_correct() {
|
||||||
let c: Result<Color, String> = (183, 65, 14).try_into();
|
let c: Result<Color, _> = (183, 65, 14).try_into();
|
||||||
|
assert!(c.is_ok());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
c,
|
c.unwrap(),
|
||||||
Ok(Color {
|
Color {
|
||||||
red: 183,
|
red: 183,
|
||||||
green: 65,
|
green: 65,
|
||||||
blue: 14
|
blue: 14
|
||||||
})
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_array_out_of_range_positive() {
|
fn test_array_out_of_range_positive() {
|
||||||
let c: Result<Color, String> = [1000, 10000, 256].try_into();
|
let c: Result<Color, _> = [1000, 10000, 256].try_into();
|
||||||
assert!(c.is_err());
|
assert_eq!(c, Err(IntoColorError::IntConversion));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_array_out_of_range_negative() {
|
fn test_array_out_of_range_negative() {
|
||||||
let c: Result<Color, String> = [-10, -256, -1].try_into();
|
let c: Result<Color, _> = [-10, -256, -1].try_into();
|
||||||
assert!(c.is_err());
|
assert_eq!(c, Err(IntoColorError::IntConversion));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_array_sum() {
|
fn test_array_sum() {
|
||||||
let c: Result<Color, String> = [-1, 255, 255].try_into();
|
let c: Result<Color, _> = [-1, 255, 255].try_into();
|
||||||
assert!(c.is_err());
|
assert_eq!(c, Err(IntoColorError::IntConversion));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_array_correct() {
|
fn test_array_correct() {
|
||||||
let c: Result<Color, String> = [183, 65, 14].try_into();
|
let c: Result<Color, _> = [183, 65, 14].try_into();
|
||||||
|
assert!(c.is_ok());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
c,
|
c.unwrap(),
|
||||||
Ok(Color {
|
Color {
|
||||||
red: 183,
|
red: 183,
|
||||||
green: 65,
|
green: 65,
|
||||||
blue: 14
|
blue: 14
|
||||||
})
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_slice_out_of_range_positive() {
|
fn test_slice_out_of_range_positive() {
|
||||||
let arr = [10000, 256, 1000];
|
let arr = [10000, 256, 1000];
|
||||||
assert!(Color::try_from(&arr[..]).is_err());
|
assert_eq!(
|
||||||
|
Color::try_from(&arr[..]),
|
||||||
|
Err(IntoColorError::IntConversion)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_slice_out_of_range_negative() {
|
fn test_slice_out_of_range_negative() {
|
||||||
let arr = [-256, -1, -10];
|
let arr = [-256, -1, -10];
|
||||||
assert!(Color::try_from(&arr[..]).is_err());
|
assert_eq!(
|
||||||
|
Color::try_from(&arr[..]),
|
||||||
|
Err(IntoColorError::IntConversion)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_slice_sum() {
|
fn test_slice_sum() {
|
||||||
let arr = [-1, 255, 255];
|
let arr = [-1, 255, 255];
|
||||||
assert!(Color::try_from(&arr[..]).is_err());
|
assert_eq!(
|
||||||
|
Color::try_from(&arr[..]),
|
||||||
|
Err(IntoColorError::IntConversion)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_slice_correct() {
|
fn test_slice_correct() {
|
||||||
let v = vec![183, 65, 14];
|
let v = vec![183, 65, 14];
|
||||||
let c: Result<Color, String> = Color::try_from(&v[..]);
|
let c: Result<Color, _> = Color::try_from(&v[..]);
|
||||||
|
assert!(c.is_ok());
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
c,
|
c.unwrap(),
|
||||||
Ok(Color {
|
Color {
|
||||||
red: 183,
|
red: 183,
|
||||||
green: 65,
|
green: 65,
|
||||||
blue: 14
|
blue: 14
|
||||||
})
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_slice_excess_length() {
|
fn test_slice_excess_length() {
|
||||||
let v = vec![0, 0, 0, 0];
|
let v = vec![0, 0, 0, 0];
|
||||||
assert!(Color::try_from(&v[..]).is_err());
|
assert_eq!(Color::try_from(&v[..]), Err(IntoColorError::BadLen));
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_slice_insufficient_length() {
|
fn test_slice_insufficient_length() {
|
||||||
let v = vec![0, 0];
|
let v = vec![0, 0];
|
||||||
assert!(Color::try_from(&v[..]).is_err());
|
assert_eq!(Color::try_from(&v[..]), Err(IntoColorError::BadLen));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,19 @@
|
||||||
// Type casting in Rust is done via the usage of the `as` operator.
|
// using_as.rs
|
||||||
// Please note that the `as` operator is not only used when type casting.
|
|
||||||
// It also helps with renaming imports.
|
|
||||||
//
|
//
|
||||||
// The goal is to make sure that the division does not fail to compile
|
// Type casting in Rust is done via the usage of the `as` operator. Please note
|
||||||
// and returns the proper type.
|
// that the `as` operator is not only used when type casting. It also helps with
|
||||||
|
// renaming imports.
|
||||||
|
//
|
||||||
|
// The goal is to make sure that the division does not fail to compile and
|
||||||
|
// returns the proper type.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint using_as` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
fn average(values: &[f64]) -> f64 {
|
fn average(values: &[f64]) -> f64 {
|
||||||
let total = values.iter().fold(0.0, |a, b| a + b);
|
let total = values.iter().sum::<f64>();
|
||||||
total / values.len()
|
total / values.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
### Enums
|
# Enums
|
||||||
|
|
||||||
Rust allows you to define types called "enums" which enumerate possible values.
|
Rust allows you to define types called "enums" which enumerate possible values.
|
||||||
Enums are a feature in many languages, but their capabilities differ in each language. Rust’s enums are most similar to algebraic data types in functional languages, such as F#, OCaml, and Haskell.
|
Enums are a feature in many languages, but their capabilities differ in each language. Rust’s enums are most similar to algebraic data types in functional languages, such as F#, OCaml, and Haskell.
|
||||||
Useful in combination with enums is Rust's "pattern matching" facility, which makes it easy to run different code for different values of an enumeration.
|
Useful in combination with enums is Rust's "pattern matching" facility, which makes it easy to run different code for different values of an enumeration.
|
||||||
|
|
||||||
#### Book Sections
|
## Further information
|
||||||
|
|
||||||
- [Enums](https://doc.rust-lang.org/book/ch06-00-enums.html)
|
- [Enums](https://doc.rust-lang.org/book/ch06-00-enums.html)
|
||||||
- [Pattern syntax](https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html)
|
- [Pattern syntax](https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// enums1.rs
|
// enums1.rs
|
||||||
// Make me compile! Execute `rustlings hint enums1` for hints!
|
//
|
||||||
|
// No hints this time! ;)
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// enums2.rs
|
// enums2.rs
|
||||||
// Make me compile! Execute `rustlings hint enums2` for hints!
|
//
|
||||||
|
// Execute `rustlings hint enums2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
@ -10,7 +12,7 @@ enum Message {
|
||||||
|
|
||||||
impl Message {
|
impl Message {
|
||||||
fn call(&self) {
|
fn call(&self) {
|
||||||
println!("{:?}", &self);
|
println!("{:?}", self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
// enums3.rs
|
// enums3.rs
|
||||||
|
//
|
||||||
// Address all the TODOs to make the tests pass!
|
// Address all the TODOs to make the tests pass!
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint enums3` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
@ -16,6 +20,7 @@ struct State {
|
||||||
color: (u8, u8, u8),
|
color: (u8, u8, u8),
|
||||||
position: Point,
|
position: Point,
|
||||||
quit: bool,
|
quit: bool,
|
||||||
|
message: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
|
@ -27,8 +32,8 @@ impl State {
|
||||||
self.quit = true;
|
self.quit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn echo(&self, s: String) {
|
fn echo(&mut self, s: String) {
|
||||||
println!("{}", s);
|
self.message = s
|
||||||
}
|
}
|
||||||
|
|
||||||
fn move_position(&mut self, p: Point) {
|
fn move_position(&mut self, p: Point) {
|
||||||
|
@ -37,6 +42,8 @@ impl State {
|
||||||
|
|
||||||
fn process(&mut self, message: Message) {
|
fn process(&mut self, message: Message) {
|
||||||
// TODO: create a match expression to process the different message variants
|
// TODO: create a match expression to process the different message variants
|
||||||
|
// Remember: When passing a tuple as a function argument, you'll need extra parentheses:
|
||||||
|
// fn function((t, u, p, l, e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,9 +57,10 @@ mod tests {
|
||||||
quit: false,
|
quit: false,
|
||||||
position: Point { x: 0, y: 0 },
|
position: Point { x: 0, y: 0 },
|
||||||
color: (0, 0, 0),
|
color: (0, 0, 0),
|
||||||
|
message: "hello world".to_string(),
|
||||||
};
|
};
|
||||||
state.process(Message::ChangeColor((255, 0, 255)));
|
state.process(Message::ChangeColor(255, 0, 255));
|
||||||
state.process(Message::Echo(String::from("hello world")));
|
state.process(Message::Echo(String::from("Hello world!")));
|
||||||
state.process(Message::Move(Point { x: 10, y: 15 }));
|
state.process(Message::Move(Point { x: 10, y: 15 }));
|
||||||
state.process(Message::Quit);
|
state.process(Message::Quit);
|
||||||
|
|
||||||
|
@ -60,5 +68,6 @@ mod tests {
|
||||||
assert_eq!(state.position.x, 10);
|
assert_eq!(state.position.x, 10);
|
||||||
assert_eq!(state.position.y, 15);
|
assert_eq!(state.position.y, 15);
|
||||||
assert_eq!(state.quit, true);
|
assert_eq!(state.quit, true);
|
||||||
|
assert_eq!(state.message, "Hello world!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,12 @@
|
||||||
For this exercise check out the sections:
|
# Error handling
|
||||||
|
|
||||||
|
Most errors aren’t serious enough to require the program to stop entirely.
|
||||||
|
Sometimes, when a function fails, it’s for a reason that you can easily interpret and respond to.
|
||||||
|
For example, if you try to open a file and that operation fails because the file doesn’t exist, you might want to create the file instead of terminating the process.
|
||||||
|
|
||||||
|
## Further information
|
||||||
|
|
||||||
- [Error Handling](https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html)
|
- [Error Handling](https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html)
|
||||||
- [Generics](https://doc.rust-lang.org/book/ch10-01-syntax.html)
|
- [Generics](https://doc.rust-lang.org/book/ch10-01-syntax.html)
|
||||||
|
- [Result](https://doc.rust-lang.org/rust-by-example/error/result.html)
|
||||||
of the Rust Book.
|
- [Boxing errors](https://doc.rust-lang.org/rust-by-example/error/multiple_error_types/boxing_errors.html)
|
||||||
|
|
|
@ -1,19 +1,22 @@
|
||||||
// errors1.rs
|
// errors1.rs
|
||||||
// This function refuses to generate text to be printed on a nametag if
|
//
|
||||||
// you pass it an empty string. It'd be nicer if it explained what the problem
|
// This function refuses to generate text to be printed on a nametag if you pass
|
||||||
// was, instead of just sometimes returning `None`. The 2nd test currently
|
// it an empty string. It'd be nicer if it explained what the problem was,
|
||||||
// does not compile or pass, but it illustrates the behavior we would like
|
// instead of just sometimes returning `None`. Thankfully, Rust has a similar
|
||||||
// this function to have.
|
// construct to `Option` that can be used to express error conditions. Let's use
|
||||||
// Execute `rustlings hint errors1` for hints!
|
// it!
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint errors1` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
pub fn generate_nametag_text(name: String) -> Option<String> {
|
pub fn generate_nametag_text(name: String) -> Option<String> {
|
||||||
if name.len() > 0 {
|
if name.is_empty() {
|
||||||
Some(format!("Hi! My name is {}", name))
|
|
||||||
} else {
|
|
||||||
// Empty names aren't allowed.
|
// Empty names aren't allowed.
|
||||||
None
|
None
|
||||||
|
} else {
|
||||||
|
Some(format!("Hi! My name is {}", name))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,14 +24,11 @@ pub fn generate_nametag_text(name: String) -> Option<String> {
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
// This test passes initially if you comment out the 2nd test.
|
|
||||||
// You'll need to update what this test expects when you change
|
|
||||||
// the function under test!
|
|
||||||
#[test]
|
#[test]
|
||||||
fn generates_nametag_text_for_a_nonempty_name() {
|
fn generates_nametag_text_for_a_nonempty_name() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
generate_nametag_text("Beyoncé".into()),
|
generate_nametag_text("Beyoncé".into()),
|
||||||
Some("Hi! My name is Beyoncé".into())
|
Ok("Hi! My name is Beyoncé".into())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,6 +36,7 @@ mod tests {
|
||||||
fn explains_why_generating_nametag_text_fails() {
|
fn explains_why_generating_nametag_text_fails() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
generate_nametag_text("".into()),
|
generate_nametag_text("".into()),
|
||||||
|
// Don't change this line
|
||||||
Err("`name` was empty; it must be nonempty.".into())
|
Err("`name` was empty; it must be nonempty.".into())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +1,23 @@
|
||||||
// errors2.rs
|
// errors2.rs
|
||||||
|
//
|
||||||
// Say we're writing a game where you can buy items with tokens. All items cost
|
// Say we're writing a game where you can buy items with tokens. All items cost
|
||||||
// 5 tokens, and whenever you purchase items there is a processing fee of 1
|
// 5 tokens, and whenever you purchase items there is a processing fee of 1
|
||||||
// token. A player of the game will type in how many items they want to buy,
|
// token. A player of the game will type in how many items they want to buy, and
|
||||||
// and the `total_cost` function will calculate the total number of tokens.
|
// the `total_cost` function will calculate the total cost of the tokens. Since
|
||||||
// Since the player typed in the quantity, though, we get it as a string-- and
|
// the player typed in the quantity, though, we get it as a string-- and they
|
||||||
// they might have typed anything, not just numbers!
|
// might have typed anything, not just numbers!
|
||||||
|
//
|
||||||
// Right now, this function isn't handling the error case at all (and isn't
|
// Right now, this function isn't handling the error case at all (and isn't
|
||||||
// handling the success case properly either). What we want to do is:
|
// handling the success case properly either). What we want to do is: if we call
|
||||||
// if we call the `parse` function on a string that is not a number, that
|
// the `total_cost` function on a string that is not a number, that function
|
||||||
// function will return a `ParseIntError`, and in that case, we want to
|
// will return a `ParseIntError`, and in that case, we want to immediately
|
||||||
// immediately return that error from our function and not try to multiply
|
// return that error from our function and not try to multiply and add.
|
||||||
// and add.
|
//
|
||||||
|
// There are at least two ways to implement this that are both correct-- but one
|
||||||
// There are at least two ways to implement this that are both correct-- but
|
// is a lot shorter!
|
||||||
// one is a lot shorter! Execute `rustlings hint errors2` for hints to both ways.
|
//
|
||||||
|
// Execute `rustlings hint errors2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
// errors3.rs
|
// errors3.rs
|
||||||
|
//
|
||||||
// This is a program that is trying to use a completed version of the
|
// This is a program that is trying to use a completed version of the
|
||||||
// `total_cost` function from the previous exercise. It's not working though!
|
// `total_cost` function from the previous exercise. It's not working though!
|
||||||
// Why not? What should we do to fix it?
|
// Why not? What should we do to fix it?
|
||||||
// Execute `rustlings hint errors3` for hints!
|
//
|
||||||
|
// Execute `rustlings hint errors3` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// result1.rs
|
// errors4.rs
|
||||||
// Make this test pass! Execute `rustlings hint result1` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint errors4` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
@ -14,6 +16,7 @@ enum CreationError {
|
||||||
|
|
||||||
impl PositiveNonzeroInteger {
|
impl PositiveNonzeroInteger {
|
||||||
fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> {
|
fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> {
|
||||||
|
// Hmm... Why is this always returning an Ok value?
|
||||||
Ok(PositiveNonzeroInteger(value as u64))
|
Ok(PositiveNonzeroInteger(value as u64))
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
// errors5.rs
|
||||||
|
//
|
||||||
|
// This program uses an altered version of the code from errors4.
|
||||||
|
//
|
||||||
|
// This exercise uses some concepts that we won't get to until later in the
|
||||||
|
// course, like `Box` and the `From` trait. It's not important to understand
|
||||||
|
// them in detail right now, but you can read ahead if you like. For now, think
|
||||||
|
// of the `Box<dyn ???>` type as an "I want anything that does ???" type, which,
|
||||||
|
// given Rust's usual standards for runtime safety, should strike you as
|
||||||
|
// somewhat lenient!
|
||||||
|
//
|
||||||
|
// In short, this particular use case for boxes is for when you want to own a
|
||||||
|
// value and you care only that it is a type which implements a particular
|
||||||
|
// trait. To do so, The Box is declared as of type Box<dyn Trait> where Trait is
|
||||||
|
// the trait the compiler looks for on any value used in that context. For this
|
||||||
|
// exercise, that context is the potential errors which can be returned in a
|
||||||
|
// Result.
|
||||||
|
//
|
||||||
|
// What can we use to describe both errors? In other words, is there a trait
|
||||||
|
// which both errors implement?
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint errors5` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
use std::error;
|
||||||
|
use std::fmt;
|
||||||
|
use std::num::ParseIntError;
|
||||||
|
|
||||||
|
// TODO: update the return type of `main()` to make this compile.
|
||||||
|
fn main() -> Result<(), Box<dyn ???>> {
|
||||||
|
let pretend_user_input = "42";
|
||||||
|
let x: i64 = pretend_user_input.parse()?;
|
||||||
|
println!("output={:?}", PositiveNonzeroInteger::new(x)?);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't change anything below this line.
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
struct PositiveNonzeroInteger(u64);
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
enum CreationError {
|
||||||
|
Negative,
|
||||||
|
Zero,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PositiveNonzeroInteger {
|
||||||
|
fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> {
|
||||||
|
match value {
|
||||||
|
x if x < 0 => Err(CreationError::Negative),
|
||||||
|
x if x == 0 => Err(CreationError::Zero),
|
||||||
|
x => Ok(PositiveNonzeroInteger(x as u64)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is required so that `CreationError` can implement `error::Error`.
|
||||||
|
impl fmt::Display for CreationError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
let description = match *self {
|
||||||
|
CreationError::Negative => "number is negative",
|
||||||
|
CreationError::Zero => "number is zero",
|
||||||
|
};
|
||||||
|
f.write_str(description)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl error::Error for CreationError {}
|
|
@ -0,0 +1,94 @@
|
||||||
|
// errors6.rs
|
||||||
|
//
|
||||||
|
// Using catch-all error types like `Box<dyn error::Error>` isn't recommended
|
||||||
|
// for library code, where callers might want to make decisions based on the
|
||||||
|
// error content, instead of printing it out or propagating it further. Here, we
|
||||||
|
// define a custom error type to make it possible for callers to decide what to
|
||||||
|
// do next when our function returns an error.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint errors6` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
use std::num::ParseIntError;
|
||||||
|
|
||||||
|
// This is a custom error type that we will be using in `parse_pos_nonzero()`.
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
enum ParsePosNonzeroError {
|
||||||
|
Creation(CreationError),
|
||||||
|
ParseInt(ParseIntError),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ParsePosNonzeroError {
|
||||||
|
fn from_creation(err: CreationError) -> ParsePosNonzeroError {
|
||||||
|
ParsePosNonzeroError::Creation(err)
|
||||||
|
}
|
||||||
|
// TODO: add another error conversion function here.
|
||||||
|
// fn from_parseint...
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_pos_nonzero(s: &str) -> Result<PositiveNonzeroInteger, ParsePosNonzeroError> {
|
||||||
|
// TODO: change this to return an appropriate error instead of panicking
|
||||||
|
// when `parse()` returns an error.
|
||||||
|
let x: i64 = s.parse().unwrap();
|
||||||
|
PositiveNonzeroInteger::new(x).map_err(ParsePosNonzeroError::from_creation)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't change anything below this line.
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
struct PositiveNonzeroInteger(u64);
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
enum CreationError {
|
||||||
|
Negative,
|
||||||
|
Zero,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PositiveNonzeroInteger {
|
||||||
|
fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> {
|
||||||
|
match value {
|
||||||
|
x if x < 0 => Err(CreationError::Negative),
|
||||||
|
x if x == 0 => Err(CreationError::Zero),
|
||||||
|
x => Ok(PositiveNonzeroInteger(x as u64)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_error() {
|
||||||
|
// We can't construct a ParseIntError, so we have to pattern match.
|
||||||
|
assert!(matches!(
|
||||||
|
parse_pos_nonzero("not a number"),
|
||||||
|
Err(ParsePosNonzeroError::ParseInt(_))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_negative() {
|
||||||
|
assert_eq!(
|
||||||
|
parse_pos_nonzero("-555"),
|
||||||
|
Err(ParsePosNonzeroError::Creation(CreationError::Negative))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_zero() {
|
||||||
|
assert_eq!(
|
||||||
|
parse_pos_nonzero("0"),
|
||||||
|
Err(ParsePosNonzeroError::Creation(CreationError::Zero))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_positive() {
|
||||||
|
let x = PositiveNonzeroInteger::new(42);
|
||||||
|
assert!(x.is_ok());
|
||||||
|
assert_eq!(parse_pos_nonzero("42"), Ok(x.unwrap()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,117 +0,0 @@
|
||||||
// errorsn.rs
|
|
||||||
// This is a bigger error exercise than the previous ones!
|
|
||||||
// You can do it! :)
|
|
||||||
//
|
|
||||||
// Edit the `read_and_validate` function ONLY. Don't create any Errors
|
|
||||||
// that do not already exist.
|
|
||||||
//
|
|
||||||
// So many things could go wrong!
|
|
||||||
//
|
|
||||||
// - Reading from stdin could produce an io::Error
|
|
||||||
// - Parsing the input could produce a num::ParseIntError
|
|
||||||
// - Validating the input could produce a CreationError (defined below)
|
|
||||||
//
|
|
||||||
// How can we lump these errors into one general error? That is, what
|
|
||||||
// type goes where the question marks are, and how do we return
|
|
||||||
// that type from the body of read_and_validate?
|
|
||||||
//
|
|
||||||
// Execute `rustlings hint errorsn` for hints :)
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
use std::error;
|
|
||||||
use std::fmt;
|
|
||||||
use std::io;
|
|
||||||
|
|
||||||
// PositiveNonzeroInteger is a struct defined below the tests.
|
|
||||||
fn read_and_validate(b: &mut dyn io::BufRead) -> Result<PositiveNonzeroInteger, ???> {
|
|
||||||
let mut line = String::new();
|
|
||||||
b.read_line(&mut line);
|
|
||||||
let num: i64 = line.trim().parse();
|
|
||||||
let answer = PositiveNonzeroInteger::new(num);
|
|
||||||
answer
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Nothing below this needs to be modified
|
|
||||||
//
|
|
||||||
|
|
||||||
// This is a test helper function that turns a &str into a BufReader.
|
|
||||||
fn test_with_str(s: &str) -> Result<PositiveNonzeroInteger, Box<dyn error::Error>> {
|
|
||||||
let mut b = io::BufReader::new(s.as_bytes());
|
|
||||||
read_and_validate(&mut b)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_success() {
|
|
||||||
let x = test_with_str("42\n");
|
|
||||||
assert_eq!(PositiveNonzeroInteger(42), x.unwrap());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_not_num() {
|
|
||||||
let x = test_with_str("eleven billion\n");
|
|
||||||
assert!(x.is_err());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_non_positive() {
|
|
||||||
let x = test_with_str("-40\n");
|
|
||||||
assert!(x.is_err());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_ioerror() {
|
|
||||||
struct Broken;
|
|
||||||
impl io::Read for Broken {
|
|
||||||
fn read(&mut self, _buf: &mut [u8]) -> io::Result<usize> {
|
|
||||||
Err(io::Error::new(io::ErrorKind::BrokenPipe, "uh-oh!"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let mut b = io::BufReader::new(Broken);
|
|
||||||
assert!(read_and_validate(&mut b).is_err());
|
|
||||||
assert_eq!("uh-oh!", read_and_validate(&mut b).unwrap_err().to_string());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(PartialEq, Debug)]
|
|
||||||
struct PositiveNonzeroInteger(u64);
|
|
||||||
|
|
||||||
impl PositiveNonzeroInteger {
|
|
||||||
fn new(value: i64) -> Result<PositiveNonzeroInteger, CreationError> {
|
|
||||||
if value == 0 {
|
|
||||||
Err(CreationError::Zero)
|
|
||||||
} else if value < 0 {
|
|
||||||
Err(CreationError::Negative)
|
|
||||||
} else {
|
|
||||||
Ok(PositiveNonzeroInteger(value as u64))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_positive_nonzero_integer_creation() {
|
|
||||||
assert!(PositiveNonzeroInteger::new(10).is_ok());
|
|
||||||
assert_eq!(
|
|
||||||
Err(CreationError::Negative),
|
|
||||||
PositiveNonzeroInteger::new(-10)
|
|
||||||
);
|
|
||||||
assert_eq!(Err(CreationError::Zero), PositiveNonzeroInteger::new(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(PartialEq, Debug)]
|
|
||||||
enum CreationError {
|
|
||||||
Negative,
|
|
||||||
Zero,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for CreationError {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
let description = match *self {
|
|
||||||
CreationError::Negative => "Number is negative",
|
|
||||||
CreationError::Zero => "Number is zero",
|
|
||||||
};
|
|
||||||
f.write_str(description)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl error::Error for CreationError {}
|
|
|
@ -1,7 +1,8 @@
|
||||||
### Functions
|
# Functions
|
||||||
|
|
||||||
Here, you'll learn how to write functions and how Rust's compiler can trace things way back.
|
Here, you'll learn how to write functions and how the Rust compiler can help you debug errors even
|
||||||
|
in more complex code.
|
||||||
|
|
||||||
#### Book Sections
|
## Further information
|
||||||
|
|
||||||
- [How Functions Work](https://doc.rust-lang.org/book/ch03-03-how-functions-work.html)
|
- [How Functions Work](https://doc.rust-lang.org/book/ch03-03-how-functions-work.html)
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// functions1.rs
|
// functions1.rs
|
||||||
// Make me compile! Execute `rustlings hint functions1` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint functions1` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// functions2.rs
|
// functions2.rs
|
||||||
// Make me compile! Execute `rustlings hint functions2` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint functions2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// functions3.rs
|
// functions3.rs
|
||||||
// Make me compile! Execute `rustlings hint functions3` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint functions3` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
@ -7,7 +9,7 @@ fn main() {
|
||||||
call_me();
|
call_me();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn call_me(num: i32) {
|
fn call_me(num: u32) {
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
println!("Ring! Call number {}", i + 1);
|
println!("Ring! Call number {}", i + 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
// functions4.rs
|
// functions4.rs
|
||||||
// Make me compile! Execute `rustlings hint functions4` for hints :)
|
//
|
||||||
|
// This store is having a sale where if the price is an even number, you get 10
|
||||||
// This store is having a sale where if the price is an even number, you get
|
// Rustbucks off, but if it's an odd number, it's 3 Rustbucks off. (Don't worry
|
||||||
// 10 Rustbucks off, but if it's an odd number, it's 3 Rustbucks off.
|
// about the function bodies themselves, we're only interested in the signatures
|
||||||
|
// for now. If anything, this is a good way to peek ahead to future exercises!)
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint functions4` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
// functions5.rs
|
// functions5.rs
|
||||||
// Make me compile! Execute `rustlings hint functions5` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint functions5` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let answer = square(3);
|
let answer = square(3);
|
||||||
println!("The answer is {}", answer);
|
println!("The square of 3 is {}", answer);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn square(num: i32) -> i32 {
|
fn square(num: i32) -> i32 {
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
### Generics
|
# Generics
|
||||||
|
|
||||||
In this section you'll learn about saving yourself many lines of code with generics!
|
Generics is the topic of generalizing types and functionalities to broader cases.
|
||||||
|
This is extremely useful for reducing code duplication in many ways, but can call for rather involving syntax.
|
||||||
|
Namely, being generic requires taking great care to specify over which types a generic type is actually considered valid.
|
||||||
|
The simplest and most common use of generics is for type parameters.
|
||||||
|
|
||||||
### Book Sections
|
## Further information
|
||||||
|
|
||||||
- [Generic Data Types](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html)
|
- [Generic Data Types](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html)
|
||||||
|
- [Bounds](https://doc.rust-lang.org/rust-by-example/generics/bounds.html)
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
// This shopping list program isn't compiling!
|
// generics1.rs
|
||||||
// Use your knowledge of generics to fix it.
|
//
|
||||||
|
// This shopping list program isn't compiling! Use your knowledge of generics to
|
||||||
|
// fix it.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint generics1` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
|
// generics2.rs
|
||||||
|
//
|
||||||
// This powerful wrapper provides the ability to store a positive integer value.
|
// This powerful wrapper provides the ability to store a positive integer value.
|
||||||
// Rewrite it using generics so that it supports wrapping ANY type.
|
// Rewrite it using generics so that it supports wrapping ANY type.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint generics2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
// An imaginary magical school has a new report card generation system written in Rust!
|
|
||||||
// Currently the system only supports creating report cards where the student's grade
|
|
||||||
// is represented numerically (e.g. 1.0 -> 5.5).
|
|
||||||
// However, the school also issues alphabetical grades (A+ -> F-) and needs
|
|
||||||
// to be able to print both types of report card!
|
|
||||||
|
|
||||||
// Make the necessary code changes in the struct ReportCard and the impl block
|
|
||||||
// to support alphabetical report cards. Change the Grade in the second test to "A+"
|
|
||||||
// to show that your changes allow alphabetical grades.
|
|
||||||
|
|
||||||
// Execute 'rustlings hint generics3' for hints!
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
pub struct ReportCard {
|
|
||||||
pub grade: f32,
|
|
||||||
pub student_name: String,
|
|
||||||
pub student_age: u8,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ReportCard {
|
|
||||||
pub fn print(&self) -> String {
|
|
||||||
format!("{} ({}) - achieved a grade of {}",
|
|
||||||
&self.student_name, &self.student_age, &self.grade)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn generate_numeric_report_card() {
|
|
||||||
let report_card = ReportCard {
|
|
||||||
grade: 2.1,
|
|
||||||
student_name: "Tom Wriggle".to_string(),
|
|
||||||
student_age: 12,
|
|
||||||
};
|
|
||||||
assert_eq!(
|
|
||||||
report_card.print(),
|
|
||||||
"Tom Wriggle (12) - achieved a grade of 2.1"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn generate_alphabetic_report_card() {
|
|
||||||
// TODO: Make sure to change the grade here after you finish the exercise.
|
|
||||||
let report_card = ReportCard {
|
|
||||||
grade: 2.1,
|
|
||||||
student_name: "Gary Plotter".to_string(),
|
|
||||||
student_age: 11,
|
|
||||||
};
|
|
||||||
assert_eq!(
|
|
||||||
report_card.print(),
|
|
||||||
"Gary Plotter (11) - achieved a grade of A+"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Hashmaps
|
||||||
|
|
||||||
|
A *hash map* allows you to associate a value with a particular key.
|
||||||
|
You may also know this by the names [*unordered map* in C++](https://en.cppreference.com/w/cpp/container/unordered_map),
|
||||||
|
[*dictionary* in Python](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) or an *associative array* in other languages.
|
||||||
|
|
||||||
|
This is the other data structure that we've been talking about before, when
|
||||||
|
talking about Vecs.
|
||||||
|
|
||||||
|
## Further information
|
||||||
|
|
||||||
|
- [Storing Keys with Associated Values in Hash Maps](https://doc.rust-lang.org/book/ch08-03-hash-maps.html)
|
|
@ -1,15 +1,15 @@
|
||||||
// hashmap1.rs
|
// hashmaps1.rs
|
||||||
// A basket of fruits in the form of a hash map needs to be defined.
|
//
|
||||||
// The key represents the name of the fruit and the value represents
|
// A basket of fruits in the form of a hash map needs to be defined. The key
|
||||||
// how many of that particular fruit is in the basket. You have to put
|
// represents the name of the fruit and the value represents how many of that
|
||||||
// at least three different types of fruits (e.g apple, banana, mango)
|
// particular fruit is in the basket. You have to put at least three different
|
||||||
// in the basket and the total count of all the fruits should be at
|
// types of fruits (e.g apple, banana, mango) in the basket and the total count
|
||||||
// least five.
|
// of all the fruits should be at least five.
|
||||||
//
|
//
|
||||||
// Make me compile and pass the tests!
|
// Make me compile and pass the tests!
|
||||||
//
|
//
|
||||||
// Execute the command `rustlings hint collections3` if you need
|
// Execute `rustlings hint hashmaps1` or use the `hint` watch subcommand for a
|
||||||
// hints.
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
@ -39,8 +39,6 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn at_least_five_fruits() {
|
fn at_least_five_fruits() {
|
||||||
let basket = fruit_basket();
|
let basket = fruit_basket();
|
||||||
assert!(basket
|
assert!(basket.values().sum::<u32>() >= 5);
|
||||||
.values()
|
|
||||||
.sum::<u32>() >= 5);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
// hashmaps2.rs
|
||||||
|
//
|
||||||
|
// We're collecting different fruits to bake a delicious fruit cake. For this,
|
||||||
|
// we have a basket, which we'll represent in the form of a hash map. The key
|
||||||
|
// represents the name of each fruit we collect and the value represents how
|
||||||
|
// many of that particular fruit we have collected. Three types of fruits -
|
||||||
|
// Apple (4), Mango (2) and Lychee (5) are already in the basket hash map. You
|
||||||
|
// must add fruit to the basket so that there is at least one of each kind and
|
||||||
|
// more than 11 in total - we have a lot of mouths to feed. You are not allowed
|
||||||
|
// to insert any more of these fruits!
|
||||||
|
//
|
||||||
|
// Make me pass the tests!
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint hashmaps2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
#[derive(Hash, PartialEq, Eq)]
|
||||||
|
enum Fruit {
|
||||||
|
Apple,
|
||||||
|
Banana,
|
||||||
|
Mango,
|
||||||
|
Lychee,
|
||||||
|
Pineapple,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fruit_basket(basket: &mut HashMap<Fruit, u32>) {
|
||||||
|
let fruit_kinds = vec![
|
||||||
|
Fruit::Apple,
|
||||||
|
Fruit::Banana,
|
||||||
|
Fruit::Mango,
|
||||||
|
Fruit::Lychee,
|
||||||
|
Fruit::Pineapple,
|
||||||
|
];
|
||||||
|
|
||||||
|
for fruit in fruit_kinds {
|
||||||
|
// TODO: Insert new fruits if they are not already present in the
|
||||||
|
// basket. Note that you are not allowed to put any type of fruit that's
|
||||||
|
// already present!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
// Don't modify this function!
|
||||||
|
fn get_fruit_basket() -> HashMap<Fruit, u32> {
|
||||||
|
let mut basket = HashMap::<Fruit, u32>::new();
|
||||||
|
basket.insert(Fruit::Apple, 4);
|
||||||
|
basket.insert(Fruit::Mango, 2);
|
||||||
|
basket.insert(Fruit::Lychee, 5);
|
||||||
|
|
||||||
|
basket
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_given_fruits_are_not_modified() {
|
||||||
|
let mut basket = get_fruit_basket();
|
||||||
|
fruit_basket(&mut basket);
|
||||||
|
assert_eq!(*basket.get(&Fruit::Apple).unwrap(), 4);
|
||||||
|
assert_eq!(*basket.get(&Fruit::Mango).unwrap(), 2);
|
||||||
|
assert_eq!(*basket.get(&Fruit::Lychee).unwrap(), 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn at_least_five_types_of_fruits() {
|
||||||
|
let mut basket = get_fruit_basket();
|
||||||
|
fruit_basket(&mut basket);
|
||||||
|
let count_fruit_kinds = basket.len();
|
||||||
|
assert!(count_fruit_kinds >= 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn greater_than_eleven_fruits() {
|
||||||
|
let mut basket = get_fruit_basket();
|
||||||
|
fruit_basket(&mut basket);
|
||||||
|
let count = basket.values().sum::<u32>();
|
||||||
|
assert!(count > 11);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn all_fruit_types_in_basket() {
|
||||||
|
let mut basket = get_fruit_basket();
|
||||||
|
fruit_basket(&mut basket);
|
||||||
|
for amount in basket.values() {
|
||||||
|
assert_ne!(amount, &0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
// hashmaps3.rs
|
||||||
|
//
|
||||||
|
// A list of scores (one per line) of a soccer match is given. Each line is of
|
||||||
|
// the form : "<team_1_name>,<team_2_name>,<team_1_goals>,<team_2_goals>"
|
||||||
|
// Example: England,France,4,2 (England scored 4 goals, France 2).
|
||||||
|
//
|
||||||
|
// You have to build a scores table containing the name of the team, goals the
|
||||||
|
// team scored, and goals the team conceded. One approach to build the scores
|
||||||
|
// table is to use a Hashmap. The solution is partially written to use a
|
||||||
|
// Hashmap, complete it to pass the test.
|
||||||
|
//
|
||||||
|
// Make me pass the tests!
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint hashmaps3` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
// A structure to store the goal details of a team.
|
||||||
|
struct Team {
|
||||||
|
goals_scored: u8,
|
||||||
|
goals_conceded: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_scores_table(results: String) -> HashMap<String, Team> {
|
||||||
|
// The name of the team is the key and its associated struct is the value.
|
||||||
|
let mut scores: HashMap<String, Team> = HashMap::new();
|
||||||
|
|
||||||
|
for r in results.lines() {
|
||||||
|
let v: Vec<&str> = r.split(',').collect();
|
||||||
|
let team_1_name = v[0].to_string();
|
||||||
|
let team_1_score: u8 = v[2].parse().unwrap();
|
||||||
|
let team_2_name = v[1].to_string();
|
||||||
|
let team_2_score: u8 = v[3].parse().unwrap();
|
||||||
|
// TODO: Populate the scores table with details extracted from the
|
||||||
|
// current line. Keep in mind that goals scored by team_1
|
||||||
|
// will be the number of goals conceded from team_2, and similarly
|
||||||
|
// goals scored by team_2 will be the number of goals conceded by
|
||||||
|
// team_1.
|
||||||
|
}
|
||||||
|
scores
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
fn get_results() -> String {
|
||||||
|
let results = "".to_string()
|
||||||
|
+ "England,France,4,2\n"
|
||||||
|
+ "France,Italy,3,1\n"
|
||||||
|
+ "Poland,Spain,2,0\n"
|
||||||
|
+ "Germany,England,2,1\n";
|
||||||
|
results
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn build_scores() {
|
||||||
|
let scores = build_scores_table(get_results());
|
||||||
|
|
||||||
|
let mut keys: Vec<&String> = scores.keys().collect();
|
||||||
|
keys.sort();
|
||||||
|
assert_eq!(
|
||||||
|
keys,
|
||||||
|
vec!["England", "France", "Germany", "Italy", "Poland", "Spain"]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn validate_team_score_1() {
|
||||||
|
let scores = build_scores_table(get_results());
|
||||||
|
let team = scores.get("England").unwrap();
|
||||||
|
assert_eq!(team.goals_scored, 5);
|
||||||
|
assert_eq!(team.goals_conceded, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn validate_team_score_2() {
|
||||||
|
let scores = build_scores_table(get_results());
|
||||||
|
let team = scores.get("Spain").unwrap();
|
||||||
|
assert_eq!(team.goals_scored, 0);
|
||||||
|
assert_eq!(team.goals_conceded, 2);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
### If
|
# If
|
||||||
|
|
||||||
`if`, the most basic type of control flow, is what you'll learn here.
|
`if`, the most basic (but still surprisingly versatile!) type of control flow, is what you'll learn here.
|
||||||
|
|
||||||
#### Book Sections
|
## Further information
|
||||||
|
|
||||||
- [Control Flow - if expressions](https://doc.rust-lang.org/book/ch03-05-control-flow.html#if-expressions)
|
- [Control Flow - if expressions](https://doc.rust-lang.org/book/ch03-05-control-flow.html#if-expressions)
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
// if1.rs
|
// if1.rs
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint if1` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
@ -7,7 +9,6 @@ pub fn bigger(a: i32, b: i32) -> i32 {
|
||||||
// Do not use:
|
// Do not use:
|
||||||
// - another function call
|
// - another function call
|
||||||
// - additional variables
|
// - additional variables
|
||||||
// Execute `rustlings hint if1` for hints
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't mind this for now :)
|
// Don't mind this for now :)
|
||||||
|
@ -24,4 +25,9 @@ mod tests {
|
||||||
fn fortytwo_is_bigger_than_thirtytwo() {
|
fn fortytwo_is_bigger_than_thirtytwo() {
|
||||||
assert_eq!(42, bigger(32, 42));
|
assert_eq!(42, bigger(32, 42));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn equal_numbers() {
|
||||||
|
assert_eq!(42, bigger(42, 42));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
// if2.rs
|
// if2.rs
|
||||||
|
//
|
||||||
// Step 1: Make me compile!
|
// Step 1: Make me compile!
|
||||||
// Step 2: Get the bar_for_fuzz and default_to_baz tests passing!
|
// Step 2: Get the bar_for_fuzz and default_to_baz tests passing!
|
||||||
// Execute the command `rustlings hint if2` if you want a hint :)
|
//
|
||||||
|
// Execute `rustlings hint if2` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
pub fn fizz_if_foo(fizzish: &str) -> &str {
|
pub fn foo_if_fizz(fizzish: &str) -> &str {
|
||||||
if fizzish == "fizz" {
|
if fizzish == "fizz" {
|
||||||
"foo"
|
"foo"
|
||||||
} else {
|
} else {
|
||||||
|
@ -21,16 +22,16 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn foo_for_fizz() {
|
fn foo_for_fizz() {
|
||||||
assert_eq!(fizz_if_foo("fizz"), "foo")
|
assert_eq!(foo_if_fizz("fizz"), "foo")
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn bar_for_fuzz() {
|
fn bar_for_fuzz() {
|
||||||
assert_eq!(fizz_if_foo("fuzz"), "bar")
|
assert_eq!(foo_if_fizz("fuzz"), "bar")
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn default_to_baz() {
|
fn default_to_baz() {
|
||||||
assert_eq!(fizz_if_foo("literally anything"), "baz")
|
assert_eq!(foo_if_fizz("literally anything"), "baz")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
// if3.rs
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint if3` or use the `hint` watch subcommand for a hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
pub fn animal_habitat(animal: &str) -> &'static str {
|
||||||
|
let identifier = if animal == "crab" {
|
||||||
|
1
|
||||||
|
} else if animal == "gopher" {
|
||||||
|
2.0
|
||||||
|
} else if animal == "snake" {
|
||||||
|
3
|
||||||
|
} else {
|
||||||
|
"Unknown"
|
||||||
|
};
|
||||||
|
|
||||||
|
// DO NOT CHANGE THIS STATEMENT BELOW
|
||||||
|
let habitat = if identifier == 1 {
|
||||||
|
"Beach"
|
||||||
|
} else if identifier == 2 {
|
||||||
|
"Burrow"
|
||||||
|
} else if identifier == 3 {
|
||||||
|
"Desert"
|
||||||
|
} else {
|
||||||
|
"Unknown"
|
||||||
|
};
|
||||||
|
|
||||||
|
habitat
|
||||||
|
}
|
||||||
|
|
||||||
|
// No test changes needed.
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn gopher_lives_in_burrow() {
|
||||||
|
assert_eq!(animal_habitat("gopher"), "Burrow")
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn snake_lives_in_desert() {
|
||||||
|
assert_eq!(animal_habitat("snake"), "Desert")
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn crab_lives_on_beach() {
|
||||||
|
assert_eq!(animal_habitat("crab"), "Beach")
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unknown_animal() {
|
||||||
|
assert_eq!(animal_habitat("dinosaur"), "Unknown")
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Intro
|
||||||
|
|
||||||
|
Rust uses the `print!` and `println!` macros to print text to the console.
|
||||||
|
|
||||||
|
## Further information
|
||||||
|
|
||||||
|
- [Hello World](https://doc.rust-lang.org/rust-by-example/hello.html)
|
||||||
|
- [Formatted print](https://doc.rust-lang.org/rust-by-example/hello/print.html)
|
|
@ -0,0 +1,41 @@
|
||||||
|
// intro1.rs
|
||||||
|
//
|
||||||
|
// About this `I AM NOT DONE` thing:
|
||||||
|
// We sometimes encourage you to keep trying things on a given exercise, even
|
||||||
|
// after you already figured it out. If you got everything working and feel
|
||||||
|
// ready for the next exercise, remove the `I AM NOT DONE` comment below.
|
||||||
|
//
|
||||||
|
// If you're running this using `rustlings watch`: The exercise file will be
|
||||||
|
// reloaded when you change one of the lines below! Try adding a `println!`
|
||||||
|
// line, or try changing what it outputs in your terminal. Try removing a
|
||||||
|
// semicolon and see what happens!
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint intro1` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("Hello and");
|
||||||
|
println!(r#" welcome to... "#);
|
||||||
|
println!(r#" _ _ _ "#);
|
||||||
|
println!(r#" _ __ _ _ ___| |_| (_)_ __ __ _ ___ "#);
|
||||||
|
println!(r#" | '__| | | / __| __| | | '_ \ / _` / __| "#);
|
||||||
|
println!(r#" | | | |_| \__ \ |_| | | | | | (_| \__ \ "#);
|
||||||
|
println!(r#" |_| \__,_|___/\__|_|_|_| |_|\__, |___/ "#);
|
||||||
|
println!(r#" |___/ "#);
|
||||||
|
println!();
|
||||||
|
println!("This exercise compiles successfully. The remaining exercises contain a compiler");
|
||||||
|
println!("or logic error. The central concept behind Rustlings is to fix these errors and");
|
||||||
|
println!("solve the exercises. Good luck!");
|
||||||
|
println!();
|
||||||
|
println!("The source for this exercise is in `exercises/intro/intro1.rs`. Have a look!");
|
||||||
|
println!(
|
||||||
|
"Going forward, the source of the exercises will always be in the success/failure output."
|
||||||
|
);
|
||||||
|
println!();
|
||||||
|
println!(
|
||||||
|
"If you want to use rust-analyzer, Rust's LSP implementation, make sure your editor is set"
|
||||||
|
);
|
||||||
|
println!("up, and then run `rustlings lsp` before continuing.")
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
// intro2.rs
|
||||||
|
//
|
||||||
|
// Make the code print a greeting to the world.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint intro2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("Hello {}!");
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Iterators
|
||||||
|
|
||||||
|
This section will teach you about Iterators.
|
||||||
|
|
||||||
|
## Further information
|
||||||
|
|
||||||
|
- [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html)
|
||||||
|
- [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/)
|
|
@ -1,16 +1,18 @@
|
||||||
// iterators1.rs
|
// iterators1.rs
|
||||||
//
|
//
|
||||||
// Make me compile by filling in the `???`s
|
// When performing operations on elements within a collection, iterators are
|
||||||
|
// essential. This module helps you get familiar with the structure of using an
|
||||||
|
// iterator and how to go through elements within an iterable collection.
|
||||||
//
|
//
|
||||||
// When performing operations on elements within a collection, iterators are essential.
|
// Make me compile by filling in the `???`s
|
||||||
// This module helps you get familiar with the structure of using an iterator and
|
|
||||||
// how to go through elements within an iterable collection.
|
|
||||||
//
|
//
|
||||||
// Execute `rustlings hint iterators1` for hints :D
|
// Execute `rustlings hint iterators1` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
fn main () {
|
#[test]
|
||||||
|
fn main() {
|
||||||
let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"];
|
let my_fav_fruits = vec!["banana", "custard apple", "avocado", "peach", "raspberry"];
|
||||||
|
|
||||||
let mut my_iterable_fav_fruits = ???; // TODO: Step 1
|
let mut my_iterable_fav_fruits = ???; // TODO: Step 1
|
||||||
|
@ -18,7 +20,7 @@ fn main () {
|
||||||
assert_eq!(my_iterable_fav_fruits.next(), Some(&"banana"));
|
assert_eq!(my_iterable_fav_fruits.next(), Some(&"banana"));
|
||||||
assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 2
|
assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 2
|
||||||
assert_eq!(my_iterable_fav_fruits.next(), Some(&"avocado"));
|
assert_eq!(my_iterable_fav_fruits.next(), Some(&"avocado"));
|
||||||
assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 2.1
|
|
||||||
assert_eq!(my_iterable_fav_fruits.next(), Some(&"raspberry"));
|
|
||||||
assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 3
|
assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 3
|
||||||
|
assert_eq!(my_iterable_fav_fruits.next(), Some(&"raspberry"));
|
||||||
|
assert_eq!(my_iterable_fav_fruits.next(), ???); // TODO: Step 4
|
||||||
}
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
// iterators2.rs
|
||||||
|
//
|
||||||
|
// In this exercise, you'll learn some of the unique advantages that iterators
|
||||||
|
// can offer. Follow the steps to complete the exercise.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint iterators2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
// Step 1.
|
||||||
|
// Complete the `capitalize_first` function.
|
||||||
|
// "hello" -> "Hello"
|
||||||
|
pub fn capitalize_first(input: &str) -> String {
|
||||||
|
let mut c = input.chars();
|
||||||
|
match c.next() {
|
||||||
|
None => String::new(),
|
||||||
|
Some(first) => ???,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 2.
|
||||||
|
// Apply the `capitalize_first` function to a slice of string slices.
|
||||||
|
// Return a vector of strings.
|
||||||
|
// ["hello", "world"] -> ["Hello", "World"]
|
||||||
|
pub fn capitalize_words_vector(words: &[&str]) -> Vec<String> {
|
||||||
|
vec![]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 3.
|
||||||
|
// Apply the `capitalize_first` function again to a slice of string slices.
|
||||||
|
// Return a single string.
|
||||||
|
// ["hello", " ", "world"] -> "Hello World"
|
||||||
|
pub fn capitalize_words_string(words: &[&str]) -> String {
|
||||||
|
String::new()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_success() {
|
||||||
|
assert_eq!(capitalize_first("hello"), "Hello");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_empty() {
|
||||||
|
assert_eq!(capitalize_first(""), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_iterate_string_vec() {
|
||||||
|
let words = vec!["hello", "world"];
|
||||||
|
assert_eq!(capitalize_words_vector(&words), ["Hello", "World"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_iterate_into_string() {
|
||||||
|
let words = vec!["hello", " ", "world"];
|
||||||
|
assert_eq!(capitalize_words_string(&words), "Hello World");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,90 @@
|
||||||
|
// iterators3.rs
|
||||||
|
//
|
||||||
|
// This is a bigger exercise than most of the others! You can do it! Here is
|
||||||
|
// your mission, should you choose to accept it:
|
||||||
|
// 1. Complete the divide function to get the first four tests to pass.
|
||||||
|
// 2. Get the remaining tests to pass by completing the result_with_list and
|
||||||
|
// list_of_results functions.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint iterators3` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
|
pub enum DivisionError {
|
||||||
|
NotDivisible(NotDivisibleError),
|
||||||
|
DivideByZero,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
|
pub struct NotDivisibleError {
|
||||||
|
dividend: i32,
|
||||||
|
divisor: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate `a` divided by `b` if `a` is evenly divisible by `b`.
|
||||||
|
// Otherwise, return a suitable error.
|
||||||
|
pub fn divide(a: i32, b: i32) -> Result<i32, DivisionError> {
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Complete the function and return a value of the correct type so the test
|
||||||
|
// passes.
|
||||||
|
// Desired output: Ok([1, 11, 1426, 3])
|
||||||
|
fn result_with_list() -> () {
|
||||||
|
let numbers = vec![27, 297, 38502, 81];
|
||||||
|
let division_results = numbers.into_iter().map(|n| divide(n, 27));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Complete the function and return a value of the correct type so the test
|
||||||
|
// passes.
|
||||||
|
// Desired output: [Ok(1), Ok(11), Ok(1426), Ok(3)]
|
||||||
|
fn list_of_results() -> () {
|
||||||
|
let numbers = vec![27, 297, 38502, 81];
|
||||||
|
let division_results = numbers.into_iter().map(|n| divide(n, 27));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_success() {
|
||||||
|
assert_eq!(divide(81, 9), Ok(9));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_not_divisible() {
|
||||||
|
assert_eq!(
|
||||||
|
divide(81, 6),
|
||||||
|
Err(DivisionError::NotDivisible(NotDivisibleError {
|
||||||
|
dividend: 81,
|
||||||
|
divisor: 6
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_divide_by_0() {
|
||||||
|
assert_eq!(divide(81, 0), Err(DivisionError::DivideByZero));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_divide_0_by_something() {
|
||||||
|
assert_eq!(divide(0, 81), Ok(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_result_with_list() {
|
||||||
|
assert_eq!(format!("{:?}", result_with_list()), "Ok([1, 11, 1426, 3])");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_list_of_results() {
|
||||||
|
assert_eq!(
|
||||||
|
format!("{:?}", list_of_results()),
|
||||||
|
"[Ok(1), Ok(11), Ok(1426), Ok(3)]"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,7 @@
|
||||||
// iterators4.rs
|
// iterators4.rs
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint iterators4` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
@ -18,6 +21,11 @@ pub fn factorial(num: u64) -> u64 {
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn factorial_of_0() {
|
||||||
|
assert_eq!(1, factorial(0));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn factorial_of_1() {
|
fn factorial_of_1() {
|
||||||
assert_eq!(1, factorial(1));
|
assert_eq!(1, factorial(1));
|
|
@ -0,0 +1,156 @@
|
||||||
|
// iterators5.rs
|
||||||
|
//
|
||||||
|
// Let's define a simple model to track Rustlings exercise progress. Progress
|
||||||
|
// will be modelled using a hash map. The name of the exercise is the key and
|
||||||
|
// the progress is the value. Two counting functions were created to count the
|
||||||
|
// number of exercises with a given progress. Recreate this counting
|
||||||
|
// functionality using iterators. Try not to use imperative loops (for, while).
|
||||||
|
// Only the two iterator methods (count_iterator and count_collection_iterator)
|
||||||
|
// need to be modified.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint iterators5` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||||
|
enum Progress {
|
||||||
|
None,
|
||||||
|
Some,
|
||||||
|
Complete,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn count_for(map: &HashMap<String, Progress>, value: Progress) -> usize {
|
||||||
|
let mut count = 0;
|
||||||
|
for val in map.values() {
|
||||||
|
if val == &value {
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
count
|
||||||
|
}
|
||||||
|
|
||||||
|
fn count_iterator(map: &HashMap<String, Progress>, value: Progress) -> usize {
|
||||||
|
// map is a hashmap with String keys and Progress values.
|
||||||
|
// map = { "variables1": Complete, "from_str": None, ... }
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn count_collection_for(collection: &[HashMap<String, Progress>], value: Progress) -> usize {
|
||||||
|
let mut count = 0;
|
||||||
|
for map in collection {
|
||||||
|
for val in map.values() {
|
||||||
|
if val == &value {
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
count
|
||||||
|
}
|
||||||
|
|
||||||
|
fn count_collection_iterator(collection: &[HashMap<String, Progress>], value: Progress) -> usize {
|
||||||
|
// collection is a slice of hashmaps.
|
||||||
|
// collection = [{ "variables1": Complete, "from_str": None, ... },
|
||||||
|
// { "variables2": Complete, ... }, ... ]
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn count_complete() {
|
||||||
|
let map = get_map();
|
||||||
|
assert_eq!(3, count_iterator(&map, Progress::Complete));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn count_some() {
|
||||||
|
let map = get_map();
|
||||||
|
assert_eq!(1, count_iterator(&map, Progress::Some));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn count_none() {
|
||||||
|
let map = get_map();
|
||||||
|
assert_eq!(2, count_iterator(&map, Progress::None));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn count_complete_equals_for() {
|
||||||
|
let map = get_map();
|
||||||
|
let progress_states = vec![Progress::Complete, Progress::Some, Progress::None];
|
||||||
|
for progress_state in progress_states {
|
||||||
|
assert_eq!(
|
||||||
|
count_for(&map, progress_state),
|
||||||
|
count_iterator(&map, progress_state)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn count_collection_complete() {
|
||||||
|
let collection = get_vec_map();
|
||||||
|
assert_eq!(
|
||||||
|
6,
|
||||||
|
count_collection_iterator(&collection, Progress::Complete)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn count_collection_some() {
|
||||||
|
let collection = get_vec_map();
|
||||||
|
assert_eq!(1, count_collection_iterator(&collection, Progress::Some));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn count_collection_none() {
|
||||||
|
let collection = get_vec_map();
|
||||||
|
assert_eq!(4, count_collection_iterator(&collection, Progress::None));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn count_collection_equals_for() {
|
||||||
|
let progress_states = vec![Progress::Complete, Progress::Some, Progress::None];
|
||||||
|
let collection = get_vec_map();
|
||||||
|
|
||||||
|
for progress_state in progress_states {
|
||||||
|
assert_eq!(
|
||||||
|
count_collection_for(&collection, progress_state),
|
||||||
|
count_collection_iterator(&collection, progress_state)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_map() -> HashMap<String, Progress> {
|
||||||
|
use Progress::*;
|
||||||
|
|
||||||
|
let mut map = HashMap::new();
|
||||||
|
map.insert(String::from("variables1"), Complete);
|
||||||
|
map.insert(String::from("functions1"), Complete);
|
||||||
|
map.insert(String::from("hashmap1"), Complete);
|
||||||
|
map.insert(String::from("arc1"), Some);
|
||||||
|
map.insert(String::from("as_ref_mut"), None);
|
||||||
|
map.insert(String::from("from_str"), None);
|
||||||
|
|
||||||
|
map
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_vec_map() -> Vec<HashMap<String, Progress>> {
|
||||||
|
use Progress::*;
|
||||||
|
|
||||||
|
let map = get_map();
|
||||||
|
|
||||||
|
let mut other = HashMap::new();
|
||||||
|
other.insert(String::from("variables2"), Complete);
|
||||||
|
other.insert(String::from("functions2"), Complete);
|
||||||
|
other.insert(String::from("if1"), Complete);
|
||||||
|
other.insert(String::from("from_into"), None);
|
||||||
|
other.insert(String::from("try_from_into"), None);
|
||||||
|
|
||||||
|
vec![map, other]
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
# Lifetimes
|
||||||
|
|
||||||
|
Lifetimes tell the compiler how to check whether references live long
|
||||||
|
enough to be valid in any given situation. For example lifetimes say
|
||||||
|
"make sure parameter 'a' lives as long as parameter 'b' so that the return
|
||||||
|
value is valid".
|
||||||
|
|
||||||
|
They are only necessary on borrows, i.e. references,
|
||||||
|
since copied parameters or moves are owned in their scope and cannot
|
||||||
|
be referenced outside. Lifetimes mean that calling code of e.g. functions
|
||||||
|
can be checked to make sure their arguments are valid. Lifetimes are
|
||||||
|
restrictive of their callers.
|
||||||
|
|
||||||
|
If you'd like to learn more about lifetime annotations, the
|
||||||
|
[lifetimekata](https://tfpk.github.io/lifetimekata/) project
|
||||||
|
has a similar style of exercises to Rustlings, but is all about
|
||||||
|
learning to write lifetime annotations.
|
||||||
|
|
||||||
|
## Further information
|
||||||
|
|
||||||
|
- [Lifetimes (in Rust By Example)](https://doc.rust-lang.org/stable/rust-by-example/scope/lifetime.html)
|
||||||
|
- [Validating References with Lifetimes](https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html)
|
|
@ -0,0 +1,27 @@
|
||||||
|
// lifetimes1.rs
|
||||||
|
//
|
||||||
|
// The Rust compiler needs to know how to check whether supplied references are
|
||||||
|
// valid, so that it can let the programmer know if a reference is at risk of
|
||||||
|
// going out of scope before it is used. Remember, references are borrows and do
|
||||||
|
// not own their own data. What if their owner goes out of scope?
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint lifetimes1` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
fn longest(x: &str, y: &str) -> &str {
|
||||||
|
if x.len() > y.len() {
|
||||||
|
x
|
||||||
|
} else {
|
||||||
|
y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let string1 = String::from("abcd");
|
||||||
|
let string2 = "xyz";
|
||||||
|
|
||||||
|
let result = longest(string1.as_str(), string2);
|
||||||
|
println!("The longest string is '{}'", result);
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
// lifetimes2.rs
|
||||||
|
//
|
||||||
|
// So if the compiler is just validating the references passed to the annotated
|
||||||
|
// parameters and the return type, what do we need to change?
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint lifetimes2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
|
||||||
|
if x.len() > y.len() {
|
||||||
|
x
|
||||||
|
} else {
|
||||||
|
y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let string1 = String::from("long string is long");
|
||||||
|
let result;
|
||||||
|
{
|
||||||
|
let string2 = String::from("xyz");
|
||||||
|
result = longest(string1.as_str(), string2.as_str());
|
||||||
|
}
|
||||||
|
println!("The longest string is '{}'", result);
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
// lifetimes3.rs
|
||||||
|
//
|
||||||
|
// Lifetimes are also needed when structs hold references.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint lifetimes3` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
struct Book {
|
||||||
|
author: &str,
|
||||||
|
title: &str,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let name = String::from("Jill Smith");
|
||||||
|
let title = String::from("Fish Flying");
|
||||||
|
let book = Book { author: &name, title: &title };
|
||||||
|
|
||||||
|
println!("{} by {}", book.title, book.author);
|
||||||
|
}
|
|
@ -1,10 +1,14 @@
|
||||||
### Macros
|
# Macros
|
||||||
|
|
||||||
Rust's macro system is very powerful, but also kind of difficult to wrap your
|
Rust's macro system is very powerful, but also kind of difficult to wrap your
|
||||||
head around. We're not going to teach you how to write your own fully-featured
|
head around. We're not going to teach you how to write your own fully-featured
|
||||||
macros. Instead, we'll show you how to use and create them.
|
macros. Instead, we'll show you how to use and create them.
|
||||||
|
|
||||||
#### Book Sections
|
If you'd like to learn more about writing your own macros, the
|
||||||
|
[macrokata](https://github.com/tfpk/macrokata) project has a similar style
|
||||||
|
of exercises to Rustlings, but is all about learning to write Macros.
|
||||||
|
|
||||||
|
## Further information
|
||||||
|
|
||||||
- [Macros](https://doc.rust-lang.org/book/ch19-06-macros.html)
|
- [Macros](https://doc.rust-lang.org/book/ch19-06-macros.html)
|
||||||
- [The Little Book of Rust Macros](https://danielkeep.github.io/tlborm/book/index.html)
|
- [The Little Book of Rust Macros](https://veykril.github.io/tlborm/)
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// macros1.rs
|
// macros1.rs
|
||||||
// Make me compile! Execute `rustlings hint macros1` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint macros1` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// macros2.rs
|
// macros2.rs
|
||||||
// Make me compile! Execute `rustlings hint macros2` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint macros2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
// macros3.rs
|
// macros3.rs
|
||||||
|
//
|
||||||
// Make me compile, without taking the macro out of the module!
|
// Make me compile, without taking the macro out of the module!
|
||||||
// Execute `rustlings hint macros3` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint macros3` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
// macros4.rs
|
// macros4.rs
|
||||||
// Make me compile! Execute `rustlings hint macros4` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint macros4` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
#[rustfmt::skip]
|
||||||
macro_rules! my_macro {
|
macro_rules! my_macro {
|
||||||
() => {
|
() => {
|
||||||
println!("Check out my macro!");
|
println!("Check out my macro!");
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
### Modules
|
# Modules
|
||||||
|
|
||||||
In this section we'll give you an introduction to Rust's module system.
|
In this section we'll give you an introduction to Rust's module system.
|
||||||
|
|
||||||
#### Book Sections
|
## Further information
|
||||||
|
|
||||||
- [The Module System](https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html)
|
- [The Module System](https://doc.rust-lang.org/book/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html)
|
||||||
|
|
|
@ -1,10 +1,18 @@
|
||||||
// modules1.rs
|
// modules1.rs
|
||||||
// Make me compile! Execute `rustlings hint modules1` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint modules1` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
mod sausage_factory {
|
mod sausage_factory {
|
||||||
|
// Don't let anybody outside of this module see this!
|
||||||
|
fn get_secret_recipe() -> String {
|
||||||
|
String::from("Ginger")
|
||||||
|
}
|
||||||
|
|
||||||
fn make_sausage() {
|
fn make_sausage() {
|
||||||
|
get_secret_recipe();
|
||||||
println!("sausage!");
|
println!("sausage!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,18 @@
|
||||||
// modules2.rs
|
// modules2.rs
|
||||||
// Make me compile! Execute `rustlings hint modules2` for hints :)
|
//
|
||||||
|
// You can bring module paths into scopes and provide new names for them with
|
||||||
|
// the 'use' and 'as' keywords. Fix these 'use' statements to make the code
|
||||||
|
// compile.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint modules2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
mod delicious_snacks {
|
mod delicious_snacks {
|
||||||
use self::fruits::PEAR as fruit;
|
// TODO: Fix these use statements
|
||||||
use self::veggies::CUCUMBER as veggie;
|
use self::fruits::PEAR as ???
|
||||||
|
use self::veggies::CUCUMBER as ???
|
||||||
|
|
||||||
mod fruits {
|
mod fruits {
|
||||||
pub const PEAR: &'static str = "Pear";
|
pub const PEAR: &'static str = "Pear";
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
// modules3.rs
|
||||||
|
//
|
||||||
|
// You can use the 'use' keyword to bring module paths from modules from
|
||||||
|
// anywhere and especially from the Rust standard library into your scope. Bring
|
||||||
|
// SystemTime and UNIX_EPOCH from the std::time module. Bonus style points if
|
||||||
|
// you can do it with one line!
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint modules3` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
// TODO: Complete this use statement
|
||||||
|
use ???
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
match SystemTime::now().duration_since(UNIX_EPOCH) {
|
||||||
|
Ok(n) => println!("1970-01-01 00:00:00 UTC was {} seconds ago!", n.as_secs()),
|
||||||
|
Err(_) => panic!("SystemTime before UNIX EPOCH!"),
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
### Move Semantics
|
# Move Semantics
|
||||||
|
|
||||||
These exercises are adapted from [pnkfelix](https://github.com/pnkfelix)'s [Rust Tutorial](https://pnkfelix.github.io/rust-examples-icfp2014/) -- Thank you Felix!!!
|
These exercises are adapted from [pnkfelix](https://github.com/pnkfelix)'s [Rust Tutorial](https://pnkfelix.github.io/rust-examples-icfp2014/) -- Thank you Felix!!!
|
||||||
|
|
||||||
#### Book Sections
|
## Further information
|
||||||
|
|
||||||
For this section, the book links are especially important.
|
For this section, the book links are especially important.
|
||||||
|
|
||||||
|
|
|
@ -1,26 +1,23 @@
|
||||||
// move_semantics1.rs
|
// move_semantics1.rs
|
||||||
// Make me compile! Execute `rustlings hint move_semantics1` for hints :)
|
//
|
||||||
|
// Execute `rustlings hint move_semantics1` or use the `hint` watch subcommand
|
||||||
|
// for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
#[test]
|
||||||
fn main() {
|
fn main() {
|
||||||
let vec0 = Vec::new();
|
let vec0 = vec![22, 44, 66];
|
||||||
|
|
||||||
let vec1 = fill_vec(vec0);
|
let vec1 = fill_vec(vec0);
|
||||||
|
|
||||||
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
assert_eq!(vec1, vec![22, 44, 66, 88]);
|
||||||
|
|
||||||
vec1.push(88);
|
|
||||||
|
|
||||||
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||||
let mut vec = vec;
|
let vec = vec;
|
||||||
|
|
||||||
vec.push(22);
|
vec.push(88);
|
||||||
vec.push(44);
|
|
||||||
vec.push(66);
|
|
||||||
|
|
||||||
vec
|
vec
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,28 +1,26 @@
|
||||||
// move_semantics2.rs
|
// move_semantics2.rs
|
||||||
// Make me compile without changing line 13!
|
//
|
||||||
// Execute `rustlings hint move_semantics2` for hints :)
|
// Make the test pass by finding a way to keep both Vecs separate!
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint move_semantics2` or use the `hint` watch subcommand
|
||||||
|
// for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
#[test]
|
||||||
fn main() {
|
fn main() {
|
||||||
let vec0 = Vec::new();
|
let vec0 = vec![22, 44, 66];
|
||||||
|
|
||||||
let mut vec1 = fill_vec(vec0);
|
let mut vec1 = fill_vec(vec0);
|
||||||
|
|
||||||
// Do not change the following line!
|
assert_eq!(vec0, vec![22, 44, 66]);
|
||||||
println!("{} has length {} content `{:?}`", "vec0", vec0.len(), vec0);
|
assert_eq!(vec1, vec![22, 44, 66, 88]);
|
||||||
|
|
||||||
vec1.push(88);
|
|
||||||
|
|
||||||
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||||
let mut vec = vec;
|
let mut vec = vec;
|
||||||
|
|
||||||
vec.push(22);
|
vec.push(88);
|
||||||
vec.push(44);
|
|
||||||
vec.push(66);
|
|
||||||
|
|
||||||
vec
|
vec
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +1,24 @@
|
||||||
// move_semantics3.rs
|
// move_semantics3.rs
|
||||||
// Make me compile without adding new lines-- just changing existing lines!
|
//
|
||||||
// (no lines with multiple semicolons necessary!)
|
// Make me compile without adding new lines -- just changing existing lines! (no
|
||||||
// Execute `rustlings hint move_semantics3` for hints :)
|
// lines with multiple semicolons necessary!)
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint move_semantics3` or use the `hint` watch subcommand
|
||||||
|
// for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
#[test]
|
||||||
fn main() {
|
fn main() {
|
||||||
let vec0 = Vec::new();
|
let vec0 = vec![22, 44, 66];
|
||||||
|
|
||||||
let mut vec1 = fill_vec(vec0);
|
let mut vec1 = fill_vec(vec0);
|
||||||
|
|
||||||
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
assert_eq!(vec1, vec![22, 44, 66, 88]);
|
||||||
|
|
||||||
vec1.push(88);
|
|
||||||
|
|
||||||
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
|
||||||
vec.push(22);
|
vec.push(88);
|
||||||
vec.push(44);
|
|
||||||
vec.push(66);
|
|
||||||
|
|
||||||
vec
|
vec
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,30 +1,29 @@
|
||||||
// move_semantics4.rs
|
// move_semantics4.rs
|
||||||
// Refactor this code so that instead of having `vec0` and creating the vector
|
//
|
||||||
// in `fn main`, we create it within `fn fill_vec` and transfer the
|
// Refactor this code so that instead of passing `vec0` into the `fill_vec`
|
||||||
// freshly created vector from fill_vec to its caller.
|
// function, the Vector gets created in the function itself and passed back to
|
||||||
// Execute `rustlings hint move_semantics4` for hints!
|
// the main function.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint move_semantics4` or use the `hint` watch subcommand
|
||||||
|
// for a hint.
|
||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
#[test]
|
||||||
fn main() {
|
fn main() {
|
||||||
let vec0 = Vec::new();
|
let vec0 = vec![22, 44, 66];
|
||||||
|
|
||||||
let mut vec1 = fill_vec(vec0);
|
let mut vec1 = fill_vec(vec0);
|
||||||
|
|
||||||
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
assert_eq!(vec1, vec![22, 44, 66, 88]);
|
||||||
|
|
||||||
vec1.push(88);
|
|
||||||
|
|
||||||
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// `fill_vec()` no longer takes `vec: Vec<i32>` as argument
|
// `fill_vec()` no longer takes `vec: Vec<i32>` as argument - don't change this!
|
||||||
fn fill_vec() -> Vec<i32> {
|
fn fill_vec() -> Vec<i32> {
|
||||||
|
// Instead, let's create and fill the Vec in here - how do you do that?
|
||||||
let mut vec = vec;
|
let mut vec = vec;
|
||||||
|
|
||||||
vec.push(22);
|
vec.push(88);
|
||||||
vec.push(44);
|
|
||||||
vec.push(66);
|
|
||||||
|
|
||||||
vec
|
vec
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
// move_semantics5.rs
|
||||||
|
//
|
||||||
|
// Make me compile only by reordering the lines in `main()`, but without adding,
|
||||||
|
// changing or removing any of them.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint move_semantics5` or use the `hint` watch subcommand
|
||||||
|
// for a hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn main() {
|
||||||
|
let mut x = 100;
|
||||||
|
let y = &mut x;
|
||||||
|
let z = &mut x;
|
||||||
|
*y += 100;
|
||||||
|
*z += 1000;
|
||||||
|
assert_eq!(x, 1200);
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
// move_semantics6.rs
|
||||||
|
//
|
||||||
|
// You can't change anything except adding or removing references.
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint move_semantics6` or use the `hint` watch subcommand
|
||||||
|
// for a hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let data = "Rust is great!".to_string();
|
||||||
|
|
||||||
|
get_char(data);
|
||||||
|
|
||||||
|
string_uppercase(&data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should not take ownership
|
||||||
|
fn get_char(data: String) -> char {
|
||||||
|
data.chars().last().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should take ownership
|
||||||
|
fn string_uppercase(mut data: &String) {
|
||||||
|
data = &data.to_uppercase();
|
||||||
|
|
||||||
|
println!("{}", data);
|
||||||
|
}
|
|
@ -1,9 +0,0 @@
|
||||||
### Option
|
|
||||||
|
|
||||||
#### Book Sections
|
|
||||||
|
|
||||||
To learn about Option<T>, check out these links:
|
|
||||||
|
|
||||||
- [Option Enum Format](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-enum-definitions)
|
|
||||||
- [Option Module Documentation](https://doc.rust-lang.org/std/option/)
|
|
||||||
- [Option Enum Documentation](https://doc.rust-lang.org/std/option/enum.Option.html)
|
|
|
@ -1,23 +0,0 @@
|
||||||
// option1.rs
|
|
||||||
// Make me compile! Execute `rustlings hint option1` for hints
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
// you can modify anything EXCEPT for this function's sig
|
|
||||||
fn print_number(maybe_number: Option<u16>) {
|
|
||||||
println!("printing: {}", maybe_number.unwrap());
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
print_number(13);
|
|
||||||
print_number(99);
|
|
||||||
|
|
||||||
let mut numbers: [Option<u16>; 5];
|
|
||||||
for iter in 0..5 {
|
|
||||||
let number_to_add: u16 = {
|
|
||||||
((iter * 1235) + 2) / (4 * 16)
|
|
||||||
};
|
|
||||||
|
|
||||||
numbers[iter as usize] = number_to_add;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
// option2.rs
|
|
||||||
// Make me compile! Execute `rustlings hint option2` for hints
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let optional_value = Some(String::from("rustlings"));
|
|
||||||
// TODO: Make this an if let statement whose value is "Some" type
|
|
||||||
value = optional_value {
|
|
||||||
println!("the value of optional value is: {}", value);
|
|
||||||
} else {
|
|
||||||
println!("The optional value doesn't contain anything!");
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut optional_values_vec: Vec<Option<i8>> = Vec::new();
|
|
||||||
for x in 1..10 {
|
|
||||||
optional_values_vec.push(Some(x));
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: make this a while let statement - remember that vector.pop also adds another layer of Option<T>
|
|
||||||
// You can stack `Option<T>`'s into while let and if let
|
|
||||||
value = optional_values_vec.pop() {
|
|
||||||
println!("current value: {}", value);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Options
|
||||||
|
|
||||||
|
Type Option represents an optional value: every Option is either Some and contains a value, or None, and does not.
|
||||||
|
Option types are very common in Rust code, as they have a number of uses:
|
||||||
|
|
||||||
|
- Initial values
|
||||||
|
- Return values for functions that are not defined over their entire input range (partial functions)
|
||||||
|
- Return value for otherwise reporting simple errors, where None is returned on error
|
||||||
|
- Optional struct fields
|
||||||
|
- Struct fields that can be loaned or "taken"
|
||||||
|
- Optional function arguments
|
||||||
|
- Nullable pointers
|
||||||
|
- Swapping things out of difficult situations
|
||||||
|
|
||||||
|
## Further Information
|
||||||
|
|
||||||
|
- [Option Enum Format](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-enum-definitions)
|
||||||
|
- [Option Module Documentation](https://doc.rust-lang.org/std/option/)
|
||||||
|
- [Option Enum Documentation](https://doc.rust-lang.org/std/option/enum.Option.html)
|
||||||
|
- [if let](https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html)
|
||||||
|
- [while let](https://doc.rust-lang.org/rust-by-example/flow_control/while_let.html)
|
|
@ -0,0 +1,39 @@
|
||||||
|
// options1.rs
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint options1` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
// This function returns how much icecream there is left in the fridge.
|
||||||
|
// If it's before 10PM, there's 5 pieces left. At 10PM, someone eats them
|
||||||
|
// all, so there'll be no more left :(
|
||||||
|
fn maybe_icecream(time_of_day: u16) -> Option<u16> {
|
||||||
|
// We use the 24-hour system here, so 10PM is a value of 22 and 12AM is a
|
||||||
|
// value of 0 The Option output should gracefully handle cases where
|
||||||
|
// time_of_day > 23.
|
||||||
|
// TODO: Complete the function body - remember to return an Option!
|
||||||
|
???
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_icecream() {
|
||||||
|
assert_eq!(maybe_icecream(9), Some(5));
|
||||||
|
assert_eq!(maybe_icecream(10), Some(5));
|
||||||
|
assert_eq!(maybe_icecream(23), Some(0));
|
||||||
|
assert_eq!(maybe_icecream(22), Some(0));
|
||||||
|
assert_eq!(maybe_icecream(25), None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn raw_value() {
|
||||||
|
// TODO: Fix this test. How do you get at the value contained in the
|
||||||
|
// Option?
|
||||||
|
let icecreams = maybe_icecream(12);
|
||||||
|
assert_eq!(icecreams, 5);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
// options2.rs
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint options2` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn simple_option() {
|
||||||
|
let target = "rustlings";
|
||||||
|
let optional_target = Some(target);
|
||||||
|
|
||||||
|
// TODO: Make this an if let statement whose value is "Some" type
|
||||||
|
word = optional_target {
|
||||||
|
assert_eq!(word, target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn layered_option() {
|
||||||
|
let range = 10;
|
||||||
|
let mut optional_integers: Vec<Option<i8>> = vec![None];
|
||||||
|
|
||||||
|
for i in 1..(range + 1) {
|
||||||
|
optional_integers.push(Some(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut cursor = range;
|
||||||
|
|
||||||
|
// TODO: make this a while let statement - remember that vector.pop also
|
||||||
|
// adds another layer of Option<T>. You can stack `Option<T>`s into
|
||||||
|
// while let and if let.
|
||||||
|
integer = optional_integers.pop() {
|
||||||
|
assert_eq!(integer, cursor);
|
||||||
|
cursor -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_eq!(cursor, 0);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
// options3.rs
|
||||||
|
//
|
||||||
|
// Execute `rustlings hint options3` or use the `hint` watch subcommand for a
|
||||||
|
// hint.
|
||||||
|
|
||||||
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
struct Point {
|
||||||
|
x: i32,
|
||||||
|
y: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let y: Option<Point> = Some(Point { x: 100, y: 200 });
|
||||||
|
|
||||||
|
match y {
|
||||||
|
Some(p) => println!("Co-ordinates are {},{} ", p.x, p.y),
|
||||||
|
_ => panic!("no match!"),
|
||||||
|
}
|
||||||
|
y; // Fix without deleting this line.
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue