%%------------------------------------------------------------------------------
%% Licensed to the Apache Software Foundation (ASF) under one or more
%% contributor license agreements.  See the NOTICE file distributed with
%% this work for additional information regarding copyright ownership.
%% The ASF licenses this file to You under the Apache License, Version 2.0
%% (the "License"); you may not use this file except in compliance with
%% the License.  You may obtain a copy of the License at
%%
%%     http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%------------------------------------------------------------------------------
-module(dubbo_config_util).

-include("dubbo.hrl").
%% API
-export([gen_consumer/3, gen_provider/5]).


gen_consumer(Application, Interface, Option) ->
    #consumer_config{
        interface = Interface,
        application = Application,
        category = <<"consumers">>,
        check = false,
        default_timeout = proplists:get_value(default_timeout, Option, 500),
        dubbo_version = proplists:get_value(dubbo_version, Option, ?DUBBO_VERSION),
        methods = [],
        revision = <<"">>,
        side = <<"consumers">>
    }.

gen_provider(Application, Port, Interface, MethodList, Option) ->
    Host = dubbo_network_tools:local_ipv4_binary(),
    MethodList2 = [atom_to_binary(Item, utf8) || Item <- MethodList],
    #provider_config{
        protocol = <<"dubbo">>,
        host = Host,
        port = Port,
        interface = Interface,
        anyhost = true,
        executes = 10,
        application = Application,
        methods = MethodList2,
        side = <<"provider">>
    }.