Skip to content

Commit be08d01

Browse files
Rodrigo ÁlvarezPapipo
Rodrigo Álvarez
authored andcommitted
Add support for application_start_module
This is an optional value within [erlang] in the gleam.toml file. It will be used for the `mod` value when generating a .app file
1 parent 22b2c00 commit be08d01

File tree

3 files changed

+42
-16
lines changed

3 files changed

+42
-16
lines changed

lib/mix/lib/mix/dep/loader.ex

+21-10
Original file line numberDiff line numberDiff line change
@@ -367,19 +367,30 @@ defmodule Mix.Dep.Loader do
367367
{dep, []}
368368
end
369369

370-
defp gleam_dep(%Mix.Dep{opts: opts} = dep, children, locked?) do
370+
defp gleam_dep(%Mix.Dep{opts: opts} = dep, _children = nil, locked?) do
371371
Mix.Gleam.require!()
372372

373-
deps =
374-
if children do
375-
Enum.map(children, &to_dep(&1, opts[:dest], _manager = nil, locked?))
376-
else
377-
config = File.cd!(opts[:dest], fn -> Mix.Gleam.load_config(".") end)
378-
from = Path.join(opts[:dest], "gleam.toml")
379-
Enum.map(config[:deps], &to_dep(&1, from, _manager = nil, locked?))
380-
end
373+
config = File.cd!(opts[:dest], fn -> Mix.Gleam.load_config(".") end)
374+
from = Path.join(opts[:dest], "gleam.toml")
375+
deps = Enum.map(config[:deps], &to_dep(&1, from, _manager = nil, locked?))
376+
377+
properties = [
378+
{:vsn, to_charlist(config[:version])},
379+
{:mod, {String.to_atom(config[:mod]), []}}
380+
]
381381

382-
{%{dep | opts: Keyword.merge(opts, app: false, override: true)}, deps}
382+
contents = :io_lib.format("~p.~n", [{:application, dep.app, properties}])
383+
384+
[opts[:build], "ebin", "#{dep.app}.app"]
385+
|> Path.join()
386+
|> File.write!(IO.chardata_to_string(contents))
387+
388+
{dep, deps}
389+
end
390+
391+
defp gleam_dep(%Mix.Dep{opts: opts} = dep, children, locked?) do
392+
dep = %{dep | opts: Keyword.merge(opts, app: false, override: true)}
393+
{dep, Enum.map(children, &to_dep(&1, opts[:dest], _manager = nil, locked?))}
383394
end
384395

385396
defp mix_children(config, locked?, opts) do

lib/mix/lib/mix/gleam.ex

+13-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ defmodule Mix.Gleam do
2424
version: Map.fetch!(json, "version"),
2525
deps: deps ++ dev_deps
2626
}
27-
|> maybe_gleam_version(json["gleam"])
27+
|> maybe_gleam_version(json)
28+
|> maybe_application_start_module(json)
2829
rescue
2930
KeyError ->
3031
Mix.raise("Command \"gleam export package-info\" unexpected format: \n" <> json)
@@ -55,10 +56,18 @@ defmodule Mix.Gleam do
5556
end
5657
end
5758

58-
defp maybe_gleam_version(config, nil), do: config
59+
defp maybe_gleam_version(config, json) do
60+
case json["gleam"] do
61+
nil -> config
62+
version -> Map.put(config, :gleam, version)
63+
end
64+
end
5965

60-
defp maybe_gleam_version(config, version) do
61-
Map.put(config, :gleam, version)
66+
defp maybe_application_start_module(config, json) do
67+
case get_in(json, ["erlang", "application_start_module"]) do
68+
nil -> config
69+
mod -> Map.put(config, :mod, mod)
70+
end
6271
end
6372

6473
def require!() do

lib/mix/test/mix/gleam_test.exs

+8-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,12 @@ defmodule Mix.GleamTest do
4949
"gleam_stdlib" => %{"version" => ">= 0.18.0 and < 2.0.0"},
5050
"my_other_project" => %{"path" => "../my_other_project"}
5151
},
52-
"dev-dependencies" => %{"gleeunit" => %{"version" => ">= 1.0.0 and < 2.0.0"}}
52+
"dev-dependencies" => %{
53+
"gleeunit" => %{"version" => ">= 1.0.0 and < 2.0.0"}
54+
},
55+
"erlang" => %{
56+
"application_start_module" => "some@application"
57+
}
5358
}
5459
|> Mix.Gleam.parse_config()
5560

@@ -62,7 +67,8 @@ defmodule Mix.GleamTest do
6267
{:gleam_stdlib, ">= 0.18.0 and < 2.0.0"},
6368
{:my_other_project, path: "../my_other_project"},
6469
{:gleeunit, ">= 1.0.0 and < 2.0.0", only: :dev}
65-
]
70+
],
71+
mod: "some@application"
6672
}
6773
end
6874
end

0 commit comments

Comments
 (0)