You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

93 lines
2.1 KiB

Code.require_file "api/comp.exs", __DIR__
Code.require_file "api/docl.exs", __DIR__
Code.require_file "api/defl.exs", __DIR__
Code.require_file "api/eval.exs", __DIR__
Code.require_file "api/info.exs", __DIR__
defmodule Alchemist.Server do
@version "0.1.0-beta"
@moduledoc """
The Alchemist-Server operates as an informant for a specific desired
Elixir Mix project and serves with informations as the following:
* Completion for Modules and functions.
* Documentation lookup for Modules and functions.
* Code evaluation and quoted representation of code.
* Definition lookup of code.
* Listing of all available Mix tasks.
* Listing of all available Modules with documentation.
"""
alias Alchemist.API
def start([env]) do
loop(all_loaded(), env)
end
def loop(loaded, env) do
line = IO.gets("") |> String.rstrip()
paths = load_paths(env)
apps = load_apps(env)
read_input(line)
purge_modules(loaded)
purge_paths(paths)
purge_apps(apps)
loop(loaded, env)
end
def read_input(line) do
case line |> String.split(" ", parts: 2) do
["COMP", args] ->
API.Comp.request(args)
["DOCL", args] ->
API.Docl.request(args)
["INFO", args] ->
API.Info.request(args)
["EVAL", args] ->
API.Eval.request(args)
["DEFL", args] ->
API.Defl.request(args)
_ ->
nil
end
end
defp all_loaded() do
for {m,_} <- :code.all_loaded, do: m
end
defp load_paths(env) do
for path <- Path.wildcard("_build/#{env}/lib/*/ebin") do
Code.prepend_path(path)
path
end
end
defp load_apps(env) do
for path <- Path.wildcard("_build/#{env}/lib/*/ebin/*.app") do
app = path |> Path.basename() |> Path.rootname() |> String.to_atom
Application.load(app)
app
end
end
defp purge_modules(loaded) do
for m <- (all_loaded() -- loaded) do
:code.delete(m)
:code.purge(m)
end
end
defp purge_paths(paths) do
for p <- paths, do: Code.delete_path(p)
end
defp purge_apps(apps) do
for a <- apps, do: Application.unload(a)
end
end