From 17a7be939f9b3bc7139e4926fbc0766305caa0a5 Mon Sep 17 00:00:00 2001 From: Nenad Date: Wed, 19 Jun 2024 15:37:35 +0200 Subject: [PATCH] Add semi-structured-logs + add missing authors --- config.json | 11 ++++++ exercises/practice/leap/.meta/config.json | 4 ++- .../semi-structured-logs/.docs/hints.md | 13 +++++++ .../.docs/instructions.md | 36 +++++++++++++++++++ .../.docs/introduction.md | 3 ++ .../semi-structured-logs/.meta/config.json | 18 ++++++++++ .../semi-structured-logs/.meta/example.cairo | 31 ++++++++++++++++ .../practice/semi-structured-logs/Scarb.toml | 4 +++ .../semi-structured-logs/src/lib.cairo | 28 +++++++++++++++ .../semi-structured-logs/src/tests.cairo | 36 +++++++++++++++++++ 10 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 exercises/practice/semi-structured-logs/.docs/hints.md create mode 100644 exercises/practice/semi-structured-logs/.docs/instructions.md create mode 100644 exercises/practice/semi-structured-logs/.docs/introduction.md create mode 100644 exercises/practice/semi-structured-logs/.meta/config.json create mode 100644 exercises/practice/semi-structured-logs/.meta/example.cairo create mode 100644 exercises/practice/semi-structured-logs/Scarb.toml create mode 100644 exercises/practice/semi-structured-logs/src/lib.cairo create mode 100644 exercises/practice/semi-structured-logs/src/tests.cairo diff --git a/config.json b/config.json index 3cb27a66..fd6c9669 100644 --- a/config.json +++ b/config.json @@ -66,6 +66,17 @@ ], "prerequisites": [], "difficulty": 1 + }, + { + "slug": "semi-structured-logs", + "name": "semi-structured-logs", + "uuid": "4ca5087f-0128-4845-89a8-a2fa7791ed98", + "practices": [ + "enums", + "match-basics" + ], + "prerequisites": [], + "difficulty": 1 } ] }, diff --git a/exercises/practice/leap/.meta/config.json b/exercises/practice/leap/.meta/config.json index 04e82176..120d45c5 100644 --- a/exercises/practice/leap/.meta/config.json +++ b/exercises/practice/leap/.meta/config.json @@ -1,5 +1,7 @@ { - "authors": [], + "authors": [ + "misicnenad" + ], "files": { "solution": [ "src/lib.cairo", diff --git a/exercises/practice/semi-structured-logs/.docs/hints.md b/exercises/practice/semi-structured-logs/.docs/hints.md new file mode 100644 index 00000000..b12260f6 --- /dev/null +++ b/exercises/practice/semi-structured-logs/.docs/hints.md @@ -0,0 +1,13 @@ +# Hints + +## General + +- [The Cairo Book - Enums][tcb-enums] +- [The Cairo Book - Match][tcb-match] + +## 1. Emit semi-structured messages + +- `match` comes in handy when working with enums. In this case, see how you might use it when figuring how what kind of log message to generate. + +[tcb-enums]: https://book.cairo-lang.org/ch06-01-enums.html +[tcb-match]: https://book.cairo-lang.org/ch06-02-the-match-control-flow-construct.html diff --git a/exercises/practice/semi-structured-logs/.docs/instructions.md b/exercises/practice/semi-structured-logs/.docs/instructions.md new file mode 100644 index 00000000..c52eb7f5 --- /dev/null +++ b/exercises/practice/semi-structured-logs/.docs/instructions.md @@ -0,0 +1,36 @@ +# Instructions + +In this exercise you'll be generating semi-structured log messages. + +## Emit semi-structured messages + +You'll start with some stubbed functions and the following enum: + +```rust +#[derive(Drop, Clone, PartialEq, Debug)] +pub enum LogLevel { + Info, + Warning, + Error, + Debug +} +``` + +Your goal is to emit a log message as follows: `"[]: "`. +You'll need to implement functions that correspond with log levels. + +For example, the below snippet demonstrates an expected output for the `log` function. + +```rust +log(LogLevel::Error, "Stack overflow") +// Returns: "[ERROR]: Stack overflow" +``` + +And for `info`: + +```rust +info("Timezone changed") +// Returns: "[INFO]: Timezone changed" +``` + +Have fun! diff --git a/exercises/practice/semi-structured-logs/.docs/introduction.md b/exercises/practice/semi-structured-logs/.docs/introduction.md new file mode 100644 index 00000000..39fd2b7a --- /dev/null +++ b/exercises/practice/semi-structured-logs/.docs/introduction.md @@ -0,0 +1,3 @@ +# Introduction + +Enums, short for enumerations, are a type that limits all possible values of some data. The possible values of an `enum` are called variants. Enums also work well with `match` and other control flow operators to help you express intent in your Cairo programs. diff --git a/exercises/practice/semi-structured-logs/.meta/config.json b/exercises/practice/semi-structured-logs/.meta/config.json new file mode 100644 index 00000000..36dc84e7 --- /dev/null +++ b/exercises/practice/semi-structured-logs/.meta/config.json @@ -0,0 +1,18 @@ +{ + "authors": [ + "misicnenad" + ], + "files": { + "solution": [ + "src/lib.cairo", + "Scarb.toml" + ], + "test": [ + "src/tests.cairo" + ], + "example": [ + ".meta/example.cairo" + ] + }, + "blurb": "Learn enums while building a logging utility." +} diff --git a/exercises/practice/semi-structured-logs/.meta/example.cairo b/exercises/practice/semi-structured-logs/.meta/example.cairo new file mode 100644 index 00000000..9ea54c15 --- /dev/null +++ b/exercises/practice/semi-structured-logs/.meta/example.cairo @@ -0,0 +1,31 @@ +#[derive(Drop, Clone, PartialEq, Debug)] +enum LogLevel { + Info, + Warning, + Error, + Debug, +} + +fn log(level: LogLevel, message: ByteArray) -> ByteArray { + match level { + LogLevel::Info => info(message), + LogLevel::Warning => warn(message), + LogLevel::Error => error(message), + LogLevel::Debug => format!("[DEBUG]: {message}"), + } +} + +fn info(message: ByteArray) -> ByteArray { + format!("[INFO]: {message}") +} + +fn warn(message: ByteArray) -> ByteArray { + format!("[WARNING]: {message}") +} + +fn error(message: ByteArray) -> ByteArray { + format!("[ERROR]: {message}") +} + +#[cfg(test)] +mod tests; diff --git a/exercises/practice/semi-structured-logs/Scarb.toml b/exercises/practice/semi-structured-logs/Scarb.toml new file mode 100644 index 00000000..7c1a6e3f --- /dev/null +++ b/exercises/practice/semi-structured-logs/Scarb.toml @@ -0,0 +1,4 @@ +[package] +name = "semi_structured_logs" +version = "0.1.0" +edition = "2023_11" diff --git a/exercises/practice/semi-structured-logs/src/lib.cairo b/exercises/practice/semi-structured-logs/src/lib.cairo new file mode 100644 index 00000000..7ec0af0b --- /dev/null +++ b/exercises/practice/semi-structured-logs/src/lib.cairo @@ -0,0 +1,28 @@ +/// various log levels +#[derive(Drop, Clone, PartialEq, Eq, Debug)] +enum LogLevel { + Info, + Warning, + Error, + Debug +} + +/// primary function for emitting logs +fn log(level: LogLevel, message: ByteArray) -> ByteArray { + panic!("return a message for the given log level") +} + +fn info(message: ByteArray) -> ByteArray { + panic!("return a message for info log level") +} + +fn warn(message: ByteArray) -> ByteArray { + panic!("return a message for warn log level") +} + +fn error(message: ByteArray) -> ByteArray { + panic!("return a message for error log level") +} + +#[cfg(test)] +mod tests; diff --git a/exercises/practice/semi-structured-logs/src/tests.cairo b/exercises/practice/semi-structured-logs/src/tests.cairo new file mode 100644 index 00000000..0e0eb17f --- /dev/null +++ b/exercises/practice/semi-structured-logs/src/tests.cairo @@ -0,0 +1,36 @@ +use semi_structured_logs::{error, info, log, warn, LogLevel}; + +#[test] +fn emits_info() { + assert_eq!(info("Timezone changed"), "[INFO]: Timezone changed"); +} + +#[test] +fn emits_warning() { + assert_eq!(warn("Timezone not set"), "[WARNING]: Timezone not set"); +} + +#[test] +fn emits_error() { + assert_eq!(error("Disk full"), "[ERROR]: Disk full"); +} + +#[test] +fn log_emits_info() { + assert_eq!(log(LogLevel::Info, "Timezone changed"), "[INFO]: Timezone changed"); +} + +#[test] +fn log_emits_warning() { + assert_eq!(log(LogLevel::Warning, "Timezone not set"), "[WARNING]: Timezone not set"); +} + +#[test] +fn log_emits_error() { + assert_eq!(log(LogLevel::Error, "Disk full"), "[ERROR]: Disk full"); +} + +#[test] +fn add_a_variant() { + assert_eq!(log(LogLevel::Debug, "reached line 123"), "[DEBUG]: reached line 123",); +}