package main

import (
	"fmt"
	"io/fs"
	"path"
	"path/filepath"
	"testing/fstest"
)

func main() {
	// Join merangkai path dengan pemisah milik sistem operasi.
	fmt.Println("join     :", filepath.Join("belajar", "go", "latihan"))
	fmt.Printf("separator: %q\n", string(filepath.Separator))

	// Clean merapikan titik dan pemisah yang berlebih.
	fmt.Println("clean    :", filepath.Clean("belajar/./go/../go/latihan"))

	// Dir, Base, dan Ext memecah path menjadi bagian-bagiannya.
	berkas := "catatan/2026/laporan.txt"
	fmt.Println("dir      :", filepath.Dir(berkas))
	fmt.Println("base     :", filepath.Base(berkas))
	fmt.Println("ext      :", filepath.Ext(berkas))

	// Abs menghasilkan path absolut dari direktori kerja saat ini.
	absolut, err := filepath.Abs("data/log.txt")
	if err != nil {
		fmt.Println("abs gagal:", err)
		return
	}
	fmt.Println("abs      :", absolut)

	// Package path selalu memakai slash, cocok untuk alamat bergaya URL.
	fmt.Println("path url :", path.Join("/blog", "golang", "fmt"))

	// WalkDir menelusuri struktur direktori secara berurutan.
	sistem := fstest.MapFS{
		"proyek/main.go":          &fstest.MapFile{},
		"proyek/internal/util.go": &fstest.MapFile{},
		"proyek/internal/teks.go": &fstest.MapFile{},
		"proyek/go.mod":           &fstest.MapFile{},
	}
	kesalahan := fs.WalkDir(sistem, "proyek", func(jalur string, d fs.DirEntry, err error) error {
		if err != nil {
			return err
		}
		jenis := "file"
		if d.IsDir() {
			jenis = "dir"
		}
		fmt.Printf("walk %-6s %s\n", jenis, jalur)
		return nil
	})
	if kesalahan != nil {
		fmt.Println("walk gagal:", kesalahan)
	}
}
