README.md

# ProperCase

An Elixir library that converts keys in maps between `snake_case` and `camel_case`.

Useful as a plug in Phoenix for converting incoming params from JavaScript's `camelCase` to Elixir's `snake_case`

Converts all keys in  maps to snake case
`ProperCase.to_snake_case/1`

Converts all keys in maps to camel case
`ProperCase.to_camel_case/1`

Converts a string to snake case
`ProperCase.snake_case/1`

Converts a string to camel case
`ProperCase.camel_case/1`

## Usage


### Example: `ProperCase.to_snake_case`
```elixir
# Before:
%{"user" => %{
    "firstName" => "Han",
    "lastName" => "Solo",
    "alliesInCombat" => [
      %{"name" => "Luke", "weaponOfChoice" => "lightsaber"},
      %{"name" => "Chewie", "weaponOfChoice" => "bowcaster"},
      %{"name" => "Leia", "weaponOfChoice" => "blaster"}
    ] 
  }
} 

# After:
%{"user" => %{
    "first_name" => "Han",
    "last_name" => "Solo",
    "allies_in_combat" => [
      %{"name" => "Luke", "weapon_of_choice" => "lightsaber"},
      %{"name" => "Chewie", "weapon_of_choice" => "bowcaster"},
      %{"name" => "Leia", "weapon_of_choice" => "blaster"}
    ]
  }
}
```


### Using as a plug in Phoenix

`ProperCase` is extremely useful as a part of your connection pipeline, converting incoming params from
JavaScript's `camelCase` to Elixir's `snake_case`

Plug it into your `router.ex` connection pipeline like so:

```elixir
  pipeline :api do
    plug :accepts, ["json"]
    plug ProperCase.Plug.SnakeCaseParams
  end
```

### camelCase before encoding json in Phoenix

Set phoenix's json encoder in `config/config.exs`, this way ProperCase will camelCase your data before
encoding to JSON:

```elixir
  :phoenix, :format_encoders, json: ProperCase.JSONEncoder.CamelCase
```

### Custom data transform before encoding with Phoenix

To ensure that outgoing params are converted to `camelCase`, define a custom JSON encoder that runs a transform before encoding to json.

```elixir
def MyApp.CustomJSONEncoder do
  use ProperCase.JSONEncoder, transform: &ProperCase.to_camel_case/1
end
```

config.exs

```elixir
  :phoenix, :format_encoders, json: MyApp.CustomJSONEncoder
```


## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed as:

  1. Add proper_case to your list of dependencies in `mix.exs`:

        def deps do
          [{:proper_case, "~> 1.0.2"}]
        end

  2. Ensure proper_case is started before your application:

        def application do
          [applications: [:proper_case]]
        end




## Contributors

- [Johnny Ji](https://github.com/johnnyji)
- [Shaun Dern](https://github.com/smdern)