summaryrefslogtreecommitdiff
path: root/components/rvi_common
diff options
context:
space:
mode:
authorMagnus Feuer <mfeuer@jaguarlandrover.com>2015-03-26 13:57:01 -0700
committerMagnus Feuer <mfeuer@jaguarlandrover.com>2015-03-26 13:57:01 -0700
commitf237b899ddd4a2f5276294b4ba5ed7fa941dc515 (patch)
tree0a2c1ea9465c4b92edb4e71c7fa94f0174d18bac /components/rvi_common
parent7ac00141a897d279dbbef90417beb06aa781f9dc (diff)
downloadrvi_core-f237b899ddd4a2f5276294b4ba5ed7fa941dc515.tar.gz
Now supports (FileName,DefaultVal) and (EnvironmentVariable,Default) in config strings.
Diffstat (limited to 'components/rvi_common')
-rw-r--r--components/rvi_common/src/rvi_config.erl137
1 files changed, 137 insertions, 0 deletions
diff --git a/components/rvi_common/src/rvi_config.erl b/components/rvi_common/src/rvi_config.erl
new file mode 100644
index 0000000..8686a29
--- /dev/null
+++ b/components/rvi_common/src/rvi_config.erl
@@ -0,0 +1,137 @@
+%%
+%% Copyright (C) 2014, Jaguar Land Rover
+%%p
+%% This program is licensed under the terms and conditions of the
+%% Mozilla Public License, version 2.0. The full text of the
+%% Mozilla Public License is at https://www.mozilla.org/MPL/2.0/
+%%
+
+-module(rvi_config).
+
+%%-include_lib("lhttpc/include/lhttpc.hrl").
+%%-include_lib("lager/include/log.hrl").
+
+-export([substitute/2]).
+
+
+
+
+%% We hit the end of the list before we saw a closing paranthesis.
+get_default(_FieldName, [], Acc) ->
+ { error, missing_end_parenthesis, lists:reverse(Acc) };
+
+
+%% We have an end paranthesis
+get_default(Field, [$) | Remainder], Acc) ->
+ { ok, Field, lists:reverse(Acc), Remainder };
+
+get_default(Field, [C | DefaultRem], Acc) ->
+ get_default(Field, DefaultRem, [ C | Acc ]).
+
+
+%% We hit the end of the list before we saw a default value or a
+%% closing parenthesis.
+get_field_and_default([], Acc) ->
+ { error, missing_end_parenthesis, lists:reverse(Acc) };
+
+
+%% We never saw a default value before we hit a closing paranthesis
+%% value.
+get_field_and_default([$) | Remain], Acc) ->
+ { error, missing_default, lists:reverse(Acc) ++ Remain };
+
+
+%% We have a field name. Extract the default value
+get_field_and_default([$, | Remain], Acc) ->
+ get_default(lists:reverse(Acc), Remain, []);
+
+
+%% Extract field name into Acc
+get_field_and_default([C | FieldNameRem], Acc) ->
+ get_field_and_default(FieldNameRem, [ C | Acc ]).
+
+
+
+%% Parse "field:default)remainder", which is a part of
+%% something like "$file(Field:Default)Remainder.
+%% Return
+%% { ok, Field, Default, Remainder)
+%% { error, Reason }
+%%
+get_field_and_default(FieldAndDefaultAndRemainder) ->
+ get_field_and_default(FieldAndDefaultAndRemainder, []).
+
+
+%% We have an end paranthesis
+substitute_file(FieldAndDefaultAndRemainder) ->
+ case get_field_and_default(FieldAndDefaultAndRemainder) of
+ { error, Reason, Rem } ->
+ { lists:reverse("ERR:"++atom_to_list(Reason)), Rem };
+
+ { ok, FileName, Default, Rem } ->
+
+ case file:open(FileName, [ read ]) of
+ { error, _ } ->
+ { lists:reverse(Default), Rem };
+
+ {ok, IOD } ->
+ case file:read_line(IOD) of
+ { ok, Data } ->
+ file:close(IOD),
+ %% Reverse and drop trailing newline
+ [ _ | Line ] = lists:reverse(Data),
+ { Line, Rem};
+
+ {error, _ } ->
+ file:close(IOD),
+ { Default, Rem }
+ end
+
+ end
+ end.
+
+
+%% Substitute { key, "hell
+substitute_env(FieldAndDefaultAndRemainder) ->
+ case get_field_and_default(FieldAndDefaultAndRemainder) of
+ { error, Reason, Rem } ->
+ { lists:reverse("ERR:"++atom_to_list(Reason)), Rem };
+
+ { ok, FieldName, Default, Rem } ->
+ case os:getenv(FieldName) of
+ false ->
+ {lists:reverse(Default), Rem};
+
+ Val ->
+ {lists:reverse(Val), Rem}
+ end
+ end.
+
+
+substitute({K,V}, _Acc) ->
+ { K, substitute(V, []) };
+
+
+substitute([ $$, $r, $v, $i, $_, $f, $i, $l, $e, $( | Remainder], Acc) ->
+ { Val, Rem } = substitute_file(Remainder),
+ substitute(Rem, Val ++ Acc);
+
+substitute([ $$, $r, $v, $i, $_, $e, $n, $v, $(| Remainder], Acc) ->
+ { Val, Rem } = substitute_env(Remainder),
+ substitute(Rem, Val ++ Acc);
+
+substitute([], Acc) ->
+ lists:reverse(Acc);
+
+substitute([ Val | Rem], Acc) when is_list(Val) ->
+ substitute(Rem, [substitute(Val, []) | Acc]);
+
+substitute([ Val | Rem], Acc) ->
+ substitute(Rem, [ substitute(Val, []) | Acc]);
+
+substitute(Other, []) ->
+ Other;
+
+substitute(Other, Acc) ->
+ [ Other | Acc ].
+