Menu
CoddyTech

Rangkuman: Parser File

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 58 dari 107.

challenge icon

Tantangan

Mudah

Mari buat parser file konfigurasi yang menggabungkan semua teknik penanganan error dari bab ini. Parser-mu akan menangani beberapa skenario kegagalan dengan tipe error khusus, error sentinel, pembungkusan error, dan pembersihan yang tepat menggunakan defer.

Kamu akan mengatur kodemu dalam tiga file:

  • errors.go: Definisikan infrastruktur error untuk parser.

    Buat dua error sentinel:

    • ErrEmptyContent dengan pesan "file content is empty"
    • ErrInvalidFormat dengan pesan "invalid configuration format"

    Buat tipe error khusus ParseError dengan field Line (int) dan Message (string). Method Error()-nya harus mengembalikan: parse error at line [Line]: [Message]

  • parser.go: Buat parser konfigurasi dengan penanganan error berlapis.

    Buat struct ConfigParser dengan field boolean parsed untuk melacak apakah parsing selesai dengan sukses.

    Implementasikan method berikut:

    • NewConfigParser() *ConfigParser - membuat parser baru dengan parsed bernilai false
    • ParseLine(lineNum int, line string) error - memvalidasi satu baris. Jika baris tidak berisi karakter =, kembalikan *ParseError dengan nomor baris dan pesan "missing key-value separator". Jika tidak, kembalikan nil.
    • Parse(content string) error - method parsing utama yang:
      • Mengembalikan ErrEmptyContent jika content kosong
      • Mengembalikan ErrInvalidFormat jika content tidak berisi setidaknya satu karakter baris baru
      • Memisahkan content berdasarkan baris baru dan memanggil ParseLine untuk setiap baris (nomor baris dimulai dari 1)
      • Jika ParseLine mengembalikan error, bungkus dengan "parsing configuration: %w" lalu kembalikan
      • Mengatur parsed menjadi true saat berhasil, lalu mengembalikan nil
    • Status() string - mengembalikan "ready" jika parsed bernilai true, jika tidak "not parsed"
  • main.go: Baca content konfigurasi dan tunjukkan pemeriksaan error secara menyeluruh.

    Baca dua baris input yang bersama-sama membentuk content konfigurasi (gabungkan dengan baris baru). Gunakan defer untuk selalu mencetak status parser di akhir, baik berhasil maupun gagal.

    Setelah mencoba melakukan parsing, periksa error menggunakan errors.Is() dan errors.As() untuk memberikan respons khusus berdasarkan penyebabnya.

Input berikut akan diberikan:

  • Baris 1: Baris pertama content konfigurasi
  • Baris 2: Baris kedua content konfigurasi

Tangani error dengan pesan khusus:

  • Jika errors.Is() menemukan ErrEmptyContent: cetak Error: No configuration provided
  • Jika errors.Is() menemukan ErrInvalidFormat: cetak Error: Configuration must have multiple lines
  • Jika errors.As() menemukan *ParseError: cetak error terbungkus secara lengkap, lalu pada baris baru cetak Fix line [Line]: [Message]
  • Jika parsing berhasil: cetak Configuration parsed successfully

Setelah menangani hasilnya (berhasil atau error), status yang ditunda harus dicetak pada baris baru: Parser status: [status]

Misalnya, jika diberikan host=localhost dan port=8080, output-mu seharusnya:

Configuration parsed successfully
Parser status: ready

Dan jika diberikan host=localhost dan invalid line, output-mu seharusnya:

parsing configuration: parse error at line 2: missing key-value separator
Fix line 2: missing key-value separator
Parser status: not parsed

Coba sendiri

package main

import (
	"bufio"
	"errors"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	
	// Baca baris pertama konfigurasi
	line1, _ := reader.ReadString('\n')
	line1 = line1[:len(line1)-1] // Hapus newline di akhir
	
	// Baca baris kedua konfigurasi
	line2, _ := reader.ReadString('\n')
	if len(line2) > 0 && line2[len(line2)-1] == '\n' {
		line2 = line2[:len(line2)-1]
	}
	
	// Gabungkan kedua baris dengan newline untuk membentuk isi konfigurasi
	content := line1 + "\n" + line2
	
	// Buat parser baru
	parser := NewConfigParser()
	
	// TODO: Gunakan defer agar status parser selalu dicetak di akhir
	// Format: "Parser status: [status]"
	
	// TODO: Coba parse isinya
	
	// TODO: Tangani error menggunakan errors.Is() dan errors.As()
	// Jika errors.Is() menemukan ErrEmptyContent: cetak "Error: No configuration provided"
	// Jika errors.Is() menemukan ErrInvalidFormat: cetak "Error: Configuration must have multiple lines"
	// Jika errors.As() menemukan *ParseError: cetak seluruh error yang dibungkus,
	//   lalu cetak "Fix line [Line]: [Message]" di baris baru
	// - Jika parsing berhasil: cetak "Configuration parsed successfully"
	
	_ = errors.Is // petunjuk: gunakan errors.Is untuk error sentinel
	_ = errors.As // petunjuk: gunakan errors.As untuk tipe error kustom
	_ = fmt.Println
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online