defmodule BibleEx.Chapter do
@moduledoc """
A Bible chapter struct.
"""
@enforce_keys [:book, :chapter_number]
defstruct book: "",
book_names: %{},
reference_type: nil,
reference: nil,
chapter_number: -1,
start_verse_number: -1,
# The first verse in this chapter represented by a [Verse] object.
start_verse: nil,
# The last verse in this chapter represented by a [Verse] object.
end_verse: nil,
# The last verse within this chapter.
end_verse_number: nil,
verses: nil,
is_valid: false
@doc """
Make a new `%Chapter{}` struct.
## Parameters
- *book*: a string that is one of the four possible book name formats
- `"GEN"` (abbr)
- `"Genesis"` (name)
- `"Gen"` (osis)
- `"Gn"` (short)
- *chapter_number*: an integer that is the chapter number
## Examples
iex> alias BibleEx.Chapter
iex> Chapter.new(book: "Gn", chapter_number: 2)
%BibleEx.Chapter{
book: "Gn",
book_names: %{abbr: "GEN", name: "Genesis", osis: "Gen", short: "Gn"},
reference_type: :chapter,
reference: "Gn 2",
chapter_number: 2,
start_verse_number: 1,
...
}
iex> alias BibleEx.Chapter
iex> Chapter.new(book: "Gn", chapter_number: nil)
%BibleEx.Chapter{
book: "Gn",
book_names: %{abbr: "GEN", name: "Genesis", osis: "Gen", short: "Gn"},
reference_type: :chapter,
reference: nil,
chapter_number: nil,
start_verse_number: 1,
start_verse: %BibleEx.Verse{
book: "Gn",
book_names: %{abbr: "GEN", name: "Genesis", osis: "Gen", short: "Gn"},
book_number: 1,
reference_type: :verse,
reference: nil,
chapter_number: nil,
verse_number: 1,
is_valid: false
},
end_verse: %BibleEx.Verse{
book: "Genesis",
book_names: %{abbr: "GEN", name: "Genesis", osis: "Gen", short: "Gn"},
book_number: 1,
reference_type: :verse,
reference: "Genesis 50:26",
chapter_number: 50,
verse_number: 26,
is_valid: true
},
end_verse_number: 26,
verses: nil,
is_valid: true
}
"""
def new(book: book, chapter_number: chapter_number) do
%__MODULE__{
book: book,
book_names: BibleEx.Librarian.get_book_names(book: book),
chapter_number: chapter_number,
reference_type: :chapter,
reference:
BibleEx.Librarian.create_reference_string(
book: book,
start_chapter: chapter_number
),
start_verse_number: 1,
start_verse: BibleEx.Verse.new(book: book, chapter_number: chapter_number, verse_number: 1),
end_verse: BibleEx.Librarian.get_last_verse(book: book, chapter: chapter_number),
end_verse_number:
BibleEx.Librarian.get_last_verse_number(book: book, chapter: chapter_number),
verses: BibleEx.Librarian.get_verses(book: book, chapter: chapter_number),
is_valid:
BibleEx.Librarian.verify_reference(
book: book,
start_chapter: chapter_number
)
}
end
end