diff options
| author | Dave Smith <dizzyd@dizzyd.com> | 2012-11-12 21:40:57 -0700 | 
|---|---|---|
| committer | Dave Smith <dizzyd@dizzyd.com> | 2012-11-12 21:40:57 -0700 | 
| commit | bf35ec939214faef0f33c5f7a04c94bde943546a (patch) | |
| tree | dea55da844cd99a6c3f0d8709b202b018cefd1e1 | |
| parent | 7dad2b384b93889961383f1f75df5be865954639 (diff) | |
| parent | 473843d3cc4a44a9b1dae2205be620a73731bc4c (diff) | |
Merge branch 'ates-diameter'
| -rw-r--r-- | ebin/rebar.app | 2 | ||||
| -rw-r--r-- | rebar.config | 5 | ||||
| -rw-r--r-- | src/rebar_dia_compiler.erl | 86 | 
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. | 
