summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ebin/rebar.app2
-rw-r--r--rebar.config5
-rw-r--r--src/rebar_dia_compiler.erl86
3 files changed, 92 insertions, 1 deletions
diff --git a/ebin/rebar.app b/ebin/rebar.app
index 8df929f..d3a50df 100644
--- a/ebin/rebar.app
+++ b/ebin/rebar.app
@@ -9,6 +9,7 @@
rebar_app_utils,
rebar_appups,
rebar_asn1_compiler,
+ rebar_dia_compiler,
rebar_base_compiler,
rebar_cleaner,
rebar_config,
@@ -67,6 +68,7 @@
rebar_protobuffs_compiler,
rebar_neotoma_compiler,
rebar_asn1_compiler,
+ rebar_dia_compiler,
rebar_erlc_compiler,
rebar_lfe_compiler,
rebar_erlydtl_compiler,
diff --git a/rebar.config b/rebar.config
index cbdaf52..b03f338 100644
--- a/rebar.config
+++ b/rebar.config
@@ -15,5 +15,8 @@
- (\"erlydtl\":\"compile\"/\"3\")
- (\"lfe_comp\":\"file\"/\"2\")
- (\"neotoma\":\"file\"/\"2\")
- - (\"protobuffs_compile\":\"scan_file\"/\"2\"))",
+ - (\"protobuffs_compile\":\"scan_file\"/\"2\")
+ - (\"diameter_codegen\":\"from_dict\"/\"4\")
+ - (\"diameter_dict_util\":\"format_error\"/\"1\")
+ - (\"diameter_dict_util\":\"parse\"/\"2\"))",
[]}]}.
diff --git a/src/rebar_dia_compiler.erl b/src/rebar_dia_compiler.erl
new file mode 100644
index 0000000..51c075b
--- /dev/null
+++ b/src/rebar_dia_compiler.erl
@@ -0,0 +1,86 @@
+%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*-
+%% ex: ts=4 sw=4 et
+%% -------------------------------------------------------------------
+%%
+%% rebar: Erlang Build Tools
+%%
+%% Copyright (c) 2009, 2010 Dave Smith (dizzyd@dizzyd.com)
+%%
+%% Permission is hereby granted, free of charge, to any person obtaining a copy
+%% of this software and associated documentation files (the "Software"), to deal
+%% in the Software without restriction, including without limitation the rights
+%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+%% copies of the Software, and to permit persons to whom the Software is
+%% furnished to do so, subject to the following conditions:
+%%
+%% The above copyright notice and this permission notice shall be included in
+%% all copies or substantial portions of the Software.
+%%
+%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+%% THE SOFTWARE.
+%% -------------------------------------------------------------------
+-module(rebar_dia_compiler).
+
+-export([compile/2, clean/2]).
+
+-include("rebar.hrl").
+
+%% ===================================================================
+%% Public API
+%% ===================================================================
+
+-spec compile(rebar_config:config(), file:filename()) -> 'ok'.
+compile(Config, _AppFile) ->
+ rebar_base_compiler:run(Config, filelib:wildcard("dia/*.dia"),
+ "dia", ".dia", "src", ".erl",
+ fun compile_dia/3).
+
+-spec clean(rebar_config:config(), file:filename()) -> 'ok'.
+clean(_Config, _AppFile) ->
+ GeneratedFiles = dia_generated_files("dia", "src", "include"),
+ ok = rebar_file_utils:delete_each(GeneratedFiles),
+ ok.
+
+-spec compile_dia(file:filename(), file:filename(),
+ rebar_config:config()) -> ok.
+compile_dia(Source, Target, Config) ->
+ ok = filelib:ensure_dir(Target),
+ ok = filelib:ensure_dir(filename:join("include", "dummy.hrl")),
+ Opts = [{outdir, "src"}] ++ rebar_config:get(Config, dia_opts, []),
+ case diameter_dict_util:parse({path, Source}, []) of
+ {ok, Spec} ->
+ FileName = dia_filename(Source, Spec),
+ diameter_codegen:from_dict(FileName, Spec, Opts, erl),
+ diameter_codegen:from_dict(FileName, Spec, Opts, hrl),
+ HrlFile = filename:join("src", FileName ++ ".hrl"),
+ case filelib:is_regular(HrlFile) of
+ true ->
+ ok = rebar_file_utils:mv(HrlFile, "include");
+ false ->
+ ok
+ end;
+ {error, Reason} ->
+ ?ERROR("~s~n", [diameter_dict_util:format_error(Reason)])
+ end.
+
+dia_generated_files(DiaDir, SrcDir, IncDir) ->
+ F = fun(File, Acc) ->
+ {ok, Spec} = diameter_dict_util:parse({path, File}, []),
+ FileName = dia_filename(File, Spec),
+ [filename:join([IncDir, FileName ++ ".hrl"]) |
+ filelib:wildcard(filename:join([SrcDir, FileName ++ ".*"]))] ++ Acc
+ end,
+ lists:foldl(F, [], filelib:wildcard(filename:join([DiaDir, "*.dia"]))).
+
+dia_filename(File, Spec) ->
+ case proplists:get_value(name, Spec) of
+ undefined ->
+ filename:rootname(filename:basename(File));
+ Name ->
+ Name
+ end.