Current section

Files

Jump to
ex_guard lib ex_guard.ex
Raw

lib/ex_guard.ex

defmodule ExGuard do
@moduledoc """
This module is the main process which listens to file changes,
triggers commands and notifications
"""
defstruct changed_files: []
use GenServer
alias ExGuard.Guard
alias ExGuard.Config
@doc false
def start_link do
:ok = Application.start :fs, :permanent
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
@doc false
def init(_) do
:erlang.send_after(2000, self(), :handle_file_changes)
:ok = :fs.subscribe
{:ok, %ExGuard{}}
end
@doc """
Executes on file changes
"""
def handle_info({_pid, {:fs, :file_event}, {path, _event}}, state) do
matched? = path
|> to_string
|> Config.match_guards
changed_files = if matched? == [] do
state.changed_files
else
Enum.uniq(state.changed_files ++ [to_string(path)])
end
{:noreply, %{state| changed_files: changed_files}}
end
@doc false
def handle_info(:handle_file_changes, state) do
case state.changed_files do
[] -> :noop
changed_files ->
changed_files
|> Enum.map(&Config.match_guards/1)
|> List.flatten
|> Enum.uniq
|> execute_guards
end
:erlang.send_after(2000, self(), :handle_file_changes)
{:noreply, %{state | changed_files: []}}
end
@doc false
def execute_guards(guards) do
guards
|> Enum.map(&Guard.execute(&1))
|> Enum.each(&Guard.notify(&1))
end
end