diff --git a/lib/d2/backbone.ex b/lib/d2/backbone.ex new file mode 100644 index 0000000..19ea4fb --- /dev/null +++ b/lib/d2/backbone.ex @@ -0,0 +1,59 @@ +defmodule ExPlain.D2.Backbone do + @moduledoc """ + Module to create backbone diagram + """ + alias ExPlain.Reader.ModuleUnit + + @spec create_diagram(ModuleUnit.t()) :: String.t() + def create_diagram(%ModuleUnit{ + name: module_name, + public_functions: public_functions, + private_functions: private_functions + }) do + classes = get_backbone_class() + header = get_header_title(module_name) + public_functions_boxes = get_public_functions_boxes(public_functions) + private_functions_boxes = get_private_functions_boxes(private_functions) + + classes <> header <> public_functions_boxes <> private_functions_boxes + end + + defp get_public_functions_boxes(public_functions) do + for fun <- public_functions, into: "", do: "#{fun}.class: public \n" + end + + defp get_private_functions_boxes(private_functions) do + for fun <- private_functions, into: "", do: "#{fun}.class: private\n" + end + + defp get_header_title(module_name) do + """ + explanation: |md + # #{module_name} + | + grid-columns: 3 + """ + end + + defp get_backbone_class do + """ + classes: { + public: { + style: { + stroke-width: 0 + fill: "#85b4ff" + shadow: true + border-radius: 5 + } + } + + private: { + style: { + fill: "#fff585" + stroke: "#F69E03" + } + } + } + """ + end +end diff --git a/lib/d2/d2.ex b/lib/d2/d2.ex new file mode 100644 index 0000000..47f95a2 --- /dev/null +++ b/lib/d2/d2.ex @@ -0,0 +1,7 @@ +defmodule ExPlain.D2 do + @moduledoc """ + Module to convert data into D2 diagrams + """ + + ### ExPlain Diagram I Module backbone diagram +end diff --git a/lib/reader/module_unit.ex b/lib/reader/module_unit.ex new file mode 100644 index 0000000..b8a6d1e --- /dev/null +++ b/lib/reader/module_unit.ex @@ -0,0 +1,15 @@ +defmodule ExPlain.Reader.ModuleUnit do + @moduledoc """ + Struct for module unit + """ + @type t() :: %__MODULE__{} + defstruct [:name, :public_functions, :private_functions] + + def new(name, public_functions \\ [], private_functions \\ []) do + %__MODULE__{ + name: name, + public_functions: public_functions, + private_functions: private_functions + } + end +end diff --git a/test/module_unit_test.exs b/test/module_unit_test.exs new file mode 100644 index 0000000..784ad45 --- /dev/null +++ b/test/module_unit_test.exs @@ -0,0 +1,8 @@ +defmodule ExPlain.Reader.ModuleUnitTest do + use ExUnit.Case + alias ExPlain.Reader.ModuleUnit + + test "create a module unit struct" do + assert %ModuleUnit{name: "MyModule"} = ModuleUnit.new("MyModule") + end +end