From cb08c08246fb8f6b49036c6725cecf94133d0e35 Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Sat, 3 May 2025 14:16:22 -0600 Subject: [PATCH] initial commit --- README.md | 2 ++ backend/.gitignore | 4 +++ backend/README.md | 24 +++++++++++++ backend/gleam.toml | 19 ++++++++++ backend/src/backend.gleam | 5 +++ backend/test/backend_test.gleam | 12 +++++++ game_client/.gitignore | 4 +++ game_client/README.md | 24 +++++++++++++ game_client/gleam.toml | 19 ++++++++++ game_client/manifest.toml | 11 ++++++ game_client/src/game_client.gleam | 5 +++ game_client/test/game_client_test.gleam | 12 +++++++ shared/.gitignore | 4 +++ shared/README.md | 24 +++++++++++++ shared/gleam.toml | 20 +++++++++++ shared/manifest.toml | 13 +++++++ shared/src/player.gleam | 23 ++++++++++++ shared/src/session.gleam | 34 ++++++++++++++++++ shared/src/shared.gleam | 5 +++ shared/test/shared_test.gleam | 47 +++++++++++++++++++++++++ 20 files changed, 311 insertions(+) create mode 100644 README.md create mode 100644 backend/.gitignore create mode 100644 backend/README.md create mode 100644 backend/gleam.toml create mode 100644 backend/src/backend.gleam create mode 100644 backend/test/backend_test.gleam create mode 100644 game_client/.gitignore create mode 100644 game_client/README.md create mode 100644 game_client/gleam.toml create mode 100644 game_client/manifest.toml create mode 100644 game_client/src/game_client.gleam create mode 100644 game_client/test/game_client_test.gleam create mode 100644 shared/.gitignore create mode 100644 shared/README.md create mode 100644 shared/gleam.toml create mode 100644 shared/manifest.toml create mode 100644 shared/src/player.gleam create mode 100644 shared/src/session.gleam create mode 100644 shared/src/shared.gleam create mode 100644 shared/test/shared_test.gleam diff --git a/README.md b/README.md new file mode 100644 index 0000000..776046e --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Play of the Game +Host "fun" game show events with your friends! diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..599be4e --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,4 @@ +*.beam +*.ez +/build +erl_crash.dump diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..0a87f90 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,24 @@ +# backend + +[![Package Version](https://img.shields.io/hexpm/v/backend)](https://hex.pm/packages/backend) +[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/backend/) + +```sh +gleam add backend@1 +``` +```gleam +import backend + +pub fn main() { + // TODO: An example of the project in use +} +``` + +Further documentation can be found at . + +## Development + +```sh +gleam run # Run the project +gleam test # Run the tests +``` diff --git a/backend/gleam.toml b/backend/gleam.toml new file mode 100644 index 0000000..84aba03 --- /dev/null +++ b/backend/gleam.toml @@ -0,0 +1,19 @@ +name = "backend" +version = "1.0.0" + +# Fill out these fields if you intend to generate HTML documentation or publish +# your project to the Hex package manager. +# +# description = "" +# licences = ["Apache-2.0"] +# repository = { type = "github", user = "", repo = "" } +# links = [{ title = "Website", href = "" }] +# +# For a full reference of all the available options, you can have a look at +# https://gleam.run/writing-gleam/gleam-toml/. + +[dependencies] +gleam_stdlib = ">= 0.44.0 and < 2.0.0" + +[dev-dependencies] +gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/backend/src/backend.gleam b/backend/src/backend.gleam new file mode 100644 index 0000000..39d017f --- /dev/null +++ b/backend/src/backend.gleam @@ -0,0 +1,5 @@ +import gleam/io + +pub fn main() { + io.println("Hello from backend!") +} diff --git a/backend/test/backend_test.gleam b/backend/test/backend_test.gleam new file mode 100644 index 0000000..3831e7a --- /dev/null +++ b/backend/test/backend_test.gleam @@ -0,0 +1,12 @@ +import gleeunit +import gleeunit/should + +pub fn main() { + gleeunit.main() +} + +// gleeunit test functions end in `_test` +pub fn hello_world_test() { + 1 + |> should.equal(1) +} diff --git a/game_client/.gitignore b/game_client/.gitignore new file mode 100644 index 0000000..599be4e --- /dev/null +++ b/game_client/.gitignore @@ -0,0 +1,4 @@ +*.beam +*.ez +/build +erl_crash.dump diff --git a/game_client/README.md b/game_client/README.md new file mode 100644 index 0000000..d3b510b --- /dev/null +++ b/game_client/README.md @@ -0,0 +1,24 @@ +# game_client + +[![Package Version](https://img.shields.io/hexpm/v/game_client)](https://hex.pm/packages/game_client) +[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/game_client/) + +```sh +gleam add game_client@1 +``` +```gleam +import game_client + +pub fn main() { + // TODO: An example of the project in use +} +``` + +Further documentation can be found at . + +## Development + +```sh +gleam run # Run the project +gleam test # Run the tests +``` diff --git a/game_client/gleam.toml b/game_client/gleam.toml new file mode 100644 index 0000000..4bca7b1 --- /dev/null +++ b/game_client/gleam.toml @@ -0,0 +1,19 @@ +name = "game_client" +version = "1.0.0" + +# Fill out these fields if you intend to generate HTML documentation or publish +# your project to the Hex package manager. +# +# description = "" +# licences = ["Apache-2.0"] +# repository = { type = "github", user = "", repo = "" } +# links = [{ title = "Website", href = "" }] +# +# For a full reference of all the available options, you can have a look at +# https://gleam.run/writing-gleam/gleam-toml/. + +[dependencies] +gleam_stdlib = ">= 0.44.0 and < 2.0.0" + +[dev-dependencies] +gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/game_client/manifest.toml b/game_client/manifest.toml new file mode 100644 index 0000000..22f5a58 --- /dev/null +++ b/game_client/manifest.toml @@ -0,0 +1,11 @@ +# This file was generated by Gleam +# You typically do not need to edit this file + +packages = [ + { name = "gleam_stdlib", version = "0.59.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "F8FEE9B35797301994B81AF75508CF87C328FE1585558B0FFD188DC2B32EAA95" }, + { name = "gleeunit", version = "1.3.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "A7DD6C07B7DA49A6E28796058AA89E651D233B357D5607006D70619CD89DAAAB" }, +] + +[requirements] +gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" } +gleeunit = { version = ">= 1.0.0 and < 2.0.0" } diff --git a/game_client/src/game_client.gleam b/game_client/src/game_client.gleam new file mode 100644 index 0000000..6642ae5 --- /dev/null +++ b/game_client/src/game_client.gleam @@ -0,0 +1,5 @@ +import gleam/io + +pub fn main() { + io.println("Hello from game_client!") +} diff --git a/game_client/test/game_client_test.gleam b/game_client/test/game_client_test.gleam new file mode 100644 index 0000000..3831e7a --- /dev/null +++ b/game_client/test/game_client_test.gleam @@ -0,0 +1,12 @@ +import gleeunit +import gleeunit/should + +pub fn main() { + gleeunit.main() +} + +// gleeunit test functions end in `_test` +pub fn hello_world_test() { + 1 + |> should.equal(1) +} diff --git a/shared/.gitignore b/shared/.gitignore new file mode 100644 index 0000000..599be4e --- /dev/null +++ b/shared/.gitignore @@ -0,0 +1,4 @@ +*.beam +*.ez +/build +erl_crash.dump diff --git a/shared/README.md b/shared/README.md new file mode 100644 index 0000000..3f60fc2 --- /dev/null +++ b/shared/README.md @@ -0,0 +1,24 @@ +# shared + +[![Package Version](https://img.shields.io/hexpm/v/shared)](https://hex.pm/packages/shared) +[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/shared/) + +```sh +gleam add shared@1 +``` +```gleam +import shared + +pub fn main() { + // TODO: An example of the project in use +} +``` + +Further documentation can be found at . + +## Development + +```sh +gleam run # Run the project +gleam test # Run the tests +``` diff --git a/shared/gleam.toml b/shared/gleam.toml new file mode 100644 index 0000000..aebaef9 --- /dev/null +++ b/shared/gleam.toml @@ -0,0 +1,20 @@ +name = "shared" +version = "1.0.0" + +# Fill out these fields if you intend to generate HTML documentation or publish +# your project to the Hex package manager. +# +# description = "" +# licences = ["Apache-2.0"] +# repository = { type = "github", user = "", repo = "" } +# links = [{ title = "Website", href = "" }] +# +# For a full reference of all the available options, you can have a look at +# https://gleam.run/writing-gleam/gleam-toml/. + +[dependencies] +gleam_stdlib = ">= 0.44.0 and < 2.0.0" +gleam_json = ">= 2.3.0 and < 3.0.0" + +[dev-dependencies] +gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/shared/manifest.toml b/shared/manifest.toml new file mode 100644 index 0000000..9e7a76b --- /dev/null +++ b/shared/manifest.toml @@ -0,0 +1,13 @@ +# This file was generated by Gleam +# You typically do not need to edit this file + +packages = [ + { name = "gleam_json", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "C55C5C2B318533A8072D221C5E06E5A75711C129E420DD1CE463342106012E5D" }, + { name = "gleam_stdlib", version = "0.59.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "F8FEE9B35797301994B81AF75508CF87C328FE1585558B0FFD188DC2B32EAA95" }, + { name = "gleeunit", version = "1.3.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "A7DD6C07B7DA49A6E28796058AA89E651D233B357D5607006D70619CD89DAAAB" }, +] + +[requirements] +gleam_json = { version = ">= 2.3.0 and < 3.0.0" } +gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" } +gleeunit = { version = ">= 1.0.0 and < 2.0.0" } diff --git a/shared/src/player.gleam b/shared/src/player.gleam new file mode 100644 index 0000000..af72a75 --- /dev/null +++ b/shared/src/player.gleam @@ -0,0 +1,23 @@ +import gleam/dynamic/decode +import gleam/json + +pub type Player { + Player(name: String, id: Int, score: Int) +} + +pub fn serialize(player: Player) -> List(#(String, json.Json)) { + [ + #("name", json.string(player.name)), + #("id", json.int(player.id)), + #("score", json.int(player.score)), + ] +} + +pub fn decoder() -> decode.Decoder(Player) { + { + use name <- decode.field("name", decode.string) + use id <- decode.field("id", decode.int) + use score <- decode.field("score", decode.int) + decode.success(Player(name:, id:, score:)) + } +} diff --git a/shared/src/session.gleam b/shared/src/session.gleam new file mode 100644 index 0000000..2639f18 --- /dev/null +++ b/shared/src/session.gleam @@ -0,0 +1,34 @@ +import gleam/dynamic/decode +import gleam/json +import gleam/list +import player + +pub type Session { + Session(id: Int, host_user_id: Int, players: List(player.Player)) +} + +pub fn serialize(session: Session) -> json.Json { + json.object([ + #("id", json.int(session.id)), + #("host_user_id", json.int(session.host_user_id)), + #( + "players", + json.array( + list.map(session.players, fn(p) { player.serialize(p) }), + of: json.object, + ), + ), + ]) +} + +pub fn deseralize(json_string: String) -> Result(Session, json.DecodeError) { + let session_decoder = { + use id <- decode.field("id", decode.int) + use host_user_id <- decode.field("host_user_id", decode.int) + use players <- decode.field("players", decode.list(player.decoder())) + + decode.success(Session(id:, host_user_id:, players:)) + } + + json.parse(from: json_string, using: session_decoder) +} diff --git a/shared/src/shared.gleam b/shared/src/shared.gleam new file mode 100644 index 0000000..4b3811b --- /dev/null +++ b/shared/src/shared.gleam @@ -0,0 +1,5 @@ +import gleam/io + +pub fn main() { + io.println("Hello from shared!") +} diff --git a/shared/test/shared_test.gleam b/shared/test/shared_test.gleam new file mode 100644 index 0000000..e2e24bf --- /dev/null +++ b/shared/test/shared_test.gleam @@ -0,0 +1,47 @@ +import gleam/json +import gleeunit +import gleeunit/should +import player +import session + +pub fn main() { + gleeunit.main() +} + +pub fn serialize_player_test() { + player.Player("CoolZero123", 55, 0) + |> player.serialize + |> should.equal([ + #("name", json.string("CoolZero123")), + #("id", json.int(55)), + #("score", json.int(0)), + ]) +} + +pub fn decoder_player_test() { + let decoder = player.decoder() + let input_str = "{\"name\": \"CoolZero123\", \"id\": 55, \"score\": 0}" + + let assert Ok(player) = json.parse(from: input_str, using: decoder) + + should.equal(player.name, "CoolZero123") + should.equal(player.id, 55) + should.equal(player.score, 0) +} + +pub fn serialzie_session_test() { + session.Session(2, 55, [player.Player("CoolZero123", 55, 0)]) + |> session.serialize + |> json.to_string + |> should.equal( + "{\"id\":2,\"host_user_id\":55,\"players\":[{\"name\":\"CoolZero123\",\"id\":55,\"score\":0}]}", + ) +} + +pub fn desarlize_session_test() { + let input_str = + "{\"id\":2,\"host_user_id\":55,\"players\":[{\"name\":\"CoolZero123\",\"id\":55,\"score\":0}]}" + let assert Ok(s) = session.deseralize(input_str) + + should.equal(s, session.Session(2, 55, [player.Player("CoolZero123", 55, 0)])) +}