···
···
Reference(book: String, chapter: Int, verse: Int)
22
+
pub type ScanState {
27
+
found_chapter: Bool,
28
+
verse_text: Result(String, String),
pub fn parse_reference(input: String) -> Result(Reference, String) {
let parts = string.split(input, on: " ")
···
case int.parse(verse_s) {
Ok(Reference(book: string.uppercase(book), chapter:, verse:))
24
-
Error(_) -> Error("Invalid verse" <> verse_s)
42
+
Error(_) -> Error("Invalid verse: " <> verse_s)
26
-
Error(_) -> Error("Invalid chapter" <> chapter_s)
44
+
Error(_) -> Error("Invalid chapter: " <> chapter_s)
46
+
[book_p1, book_p2, chapter_s, verse_s] ->
47
+
case int.parse(chapter_s) {
49
+
case int.parse(verse_s) {
52
+
book: string.uppercase(book_p1 <> " " <> book_p2),
56
+
Error(_) -> Error("Invalid verse: " <> verse_s)
58
+
Error(_) -> Error("Invalid chapter: " <> chapter_s)
_ -> Error("invalid parse")
···
let assert Ok(reference) = parse_reference(search)
41
-
list.each(biblelines, fn(line) {
43
-
"THE BOOK OF " <> book if book == reference.book -> io.println(book)
79
+
found_chapter: False,
80
+
verse_text: Error("Verse not found"),
84
+
list.fold(biblelines, inital, fn(state, line) -> ScanState {
89
+
"THE BOOK OF " <> book ->
90
+
case book == state.ref.book {
91
+
True -> ScanState(..state, phase: Chapter, found_book: True)
98
+
"CHAPTER " <> chapter ->
99
+
case result.unwrap(int.parse(chapter), 0) == state.ref.chapter {
100
+
True -> ScanState(..state, phase: Verse, found_chapter: True)
107
+
let parts = string.split(line, " ")
110
+
case result.unwrap(int.parse(first), 0) == state.ref.verse {
115
+
verse_text: Ok(string.join(rest, " ")),
125
+
case result.verse_text {
130
+
<> int.to_string(result.ref.chapter)
132
+
<> int.to_string(result.ref.chapter)
136
+
Error(e) -> io.println_error(e)