lib/xapi/docs/docs.ex

defmodule Xmeta.Xapi.Docs do
  @moduledoc """
  文档模块函数
  """

  @doc """
  获取Xapi系统信息
  """
  def get_host_info() do
    config = Mix.Project.config()

    %{
      name: config[:name] || config[:app],
      host: Node.self(),
      verison: config[:version],
      app: config[:app],
      type: config[:type] || "unknow",
      env: Atom.to_string(Mix.env())
    }
  end

  # 查找mod
  def find_child_module(base_module) do
    # 查找所有模块
    modules =
      if Mix.Project.umbrella?() do
        sys_mods =
          for app_name <- Map.keys(Mix.Project.apps_paths()) do
            if app_name != :xmeta do
              find_app_module(app_name)
            else
              []
            end
          end

        List.flatten(sys_mods)
      else
        {_, keys} = Mix.Project.config()[:app] |> :application.get_all_key()
        keys[:modules]
      end
      filter_modules(base_module,modules)
  end

  def filter_modules(base_module, modules) do
    # 过滤
    module_name = to_string(base_module)
    child_wrold_count = base_module |> Module.split() |> length

    Enum.reduce(modules, [], fn mod, acc ->
      if mod do
        world_count = mod |> Module.split() |> length
        child_module_name = to_string(mod)

        if child_wrold_count + 1 == world_count and
             String.contains?(child_module_name, module_name) do
          acc ++ [mod]
        else
          acc
        end
      else
        acc
      end
    end)
  end

  def get_xmeta_env_module(atom_type) do
    mods = Application.get_env(:xmeta, atom_type)
    if mods, do: mods, else: []
  end

  defp find_app_module(app_name) do
    {_, all_mod} = :application.get_all_key(app_name)
    all_mod[:modules]
  end

  @doc """
  获取site
  """
  def get_site_module() do
    find_child_module(Xapi)
  end
end