MapSchema

It´s a Simple, Agile, Map schema in Elixir with types check , with integer and float number autocasting of string to number and include json encoding using the popular Jason library.

Installation

def deps do
  [
    {:map_schema, "~> 0.1.0"}
  ]
end

Usage

The map_schema will include in the module multiple methods with documentation even with some doctest examples... ;) then it´s simple create your schema, add ex_doc in mix, and use mix docs and your team will can see all methods that your module will have thanks the "witchcraft" of elixir macros, all ready to use it.

defmodule MapSchema.Examples.Person do
  @moduledoc false
  use MapSchema,
    schema: %{
        "name" => :string,
        "surname" => :string,
        "country" => :string,
        "age" => :integer,
        "contact" => %{
          "email" => :string,
          "phone" => :string,
          "others" => :any
        }
    }

    
end

Basics functions

Method Description
new Constructor
schema Return the Schema
is_valid?(map) Is valid the map?

Gets and Puts functions

  test "Example get and put usage" do
    person = Person.new()
      |> Person.put_name("Leo")
      |> Person.put_surname("Messi")
      |> Person.put_country("Argentina")
      |> Person.put_age(33)

    assert Person.get_name(person) == "Leo"
    assert Person.get_surname(person) == "Messi"
    assert Person.get_country(person) == "Argentina"
    assert Person.get_age(person) == 33
  end
Gets Puts
get_name(map) put_name(map,value)
get_surname(map) put_surname(map,value)
get_country(map) put_country(map,value)
get_age(map) put_age(map,value)
get_contact_email(map) put_contact_email(map,value)
get_contact_phone(map) put_contact_phone(map,value)
get_contact_others(map) put_contact_others(map,value)

General Put

  test "Example general put function" do
    person = Person.new() # %{}
    person = Person.put(person, %{
      "contact" => %{"email" => "example@mail.com" },
      "country" => "Spain"
    }) # %{"country" => "Spain","contact" => %{"email" => "example@mail.com"}}

    assert Person.get_contact_email(person) == "example@mail.com"
    assert Person.get_country(person) == "Spain"
  end

Mutation functions

  test "Example mutation of age" do
    person = Person.new() # %{}
    |> Person.put_age(29) # %{"age" => 29}
    |> Person.mut_age(&(&1 + 1)) # %{"age" => 30}

    assert Person.get_age(person) == 30
  end
Method Description
mut_name(map,fn_mut) Change the value of name using fn_mut
mut_surname(map,fn_mut) Change the value of surname using fn_mut
mut_country(map,fn_mut) Change the value of country using fn_mut
mut_age(map,fn_mut) Change the value of age using fn_mut
mut_contact_email(map,fn_mut) Change the value using fn_mut
mut_contact_phone(map,fn_mut) Change the value using fn_mut
mut_contact_others(map,fn_mut) Change the value using fn_mut

JSON ENCONDING

  test "Example of json encoding" do
    person = Person.new()
    person = Person.put(person, %{
      "contact" => %{"email" => "hi@mail.com" },
      "age" => 45
    })

    json = Person.json_encode(person)
    json_expected ="{\"age\":45,\"contact\":{\"email\":\"hi@mail.com\"}}"
    assert json == json_expected

    person_json = Person.json_decode(json)

    assert Person.get_contact_email(person_json) == "hi@mail.com"
    assert Person.get_age(person_json) == 45
  end
Method Description
json_encode(map) Map to Json
json_encode(json) Json to Map (Check typing, and cast)
json_encode(mapa, json) Json to Existing Map (Checking typing, and cast)

Table of Types

Note: :string_to_integer and :string_to_float make implicit the cast of string to number then automatic and simple you will have your information in the right format and type following the schema define. ;)

Type Use Guard
:integer :is_integer
:float :is_float
:string_to_integer :is_integer
:string_to_float :is_float
:string :is_bitstring
:bool :is_boolean
:boolean :is_boolean
:map :is_map
:list :is_list
:any NONE
in othercase NONE

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/map_schema.