charm/bubbletea في Go: دليل شامل مع أمثلة عملية
1. ما هي مكتبة Bubble Tea ولماذا تستخدمها؟
Bubble Tea هو إطار عمل قوي وأنيق وعالي الإنتاجية لبناء واجهات المستخدم الطرفية (TUI) بلغة Go. مستوحى من بنية البرمجة الوظيفية Elm، يقدم نموذجًا بسيطًا ولكنه مرن للغاية يعتمد على ثلاثة مفاهيم رئيسية: Model (الحالة)، Update (دالة التحديث)، وView (دالة العرض).
لماذا تستخدم Bubble Tea؟ إذا كنت قد مللت من أدوات سطر الأوامر (CLI) البسيطة ذات السطر الواحد، وتريد بناء تطبيقات تفاعلية وجميلة وسريعة الاستجابة مباشرة في الطرفية، فهذه هي أداتك المثالية. تتيح لك Bubble Tea بناء كل شيء بدءًا من نماذج الإدخال البسيطة وقوائم الاختيار، وصولاً إلى مديري الملفات المعقدين، ومشغلات الموسيقى، والألعاب، ولوحات المراقبة. تتولى المكتبة جميع المهام منخفضة المستوى للتعامل مع الطرفية (معالجة الإشارات، التحكم بالمؤشر، العرض)، مما يسمح للمطور بالتركيز على منطق التطبيق.
هذه المكتبة هي جزء من نظام Charm البيئي، والذي يتضمن أدوات مفيدة أخرى مثل Bubbles (مجموعة من المكونات الجاهزة مثل حقول النص، ومؤشرات التحميل، وأشرطة التقدم) وLip Gloss (مكتبة لتنسيق المخرجات). معًا، تشكل مجموعة متكاملة لبناء تطبيقات TUI احترافية.
2. طريقة التثبيت
يتم تثبيت المكتبة بالطريقة القياسية في Go:
go get github.com/charmbracelet/bubbletea@latest
لاستخدام المكونات الجاهزة (الودجات)، يُنصح أيضًا بتثبيت حزمة bubbles:
go get github.com/charmbracelet/bubbles@latest
ولتنسيق المخرجات:
go get github.com/charmbracelet/lipgloss@latest
3. البداية السريعة — مثال عملي بسيط
قم بإنشاء ملف main.go والصق الكود التالي. هذا التطبيق سيعرض عدد مرات الضغط على المفاتيح. اضغط Ctrl+C للخروج.
package main
import (
"fmt"
"os"
tea "github.com/charmbracelet/bubbletea"
)
// 1. Model (النموذج) — يخزن حالة التطبيق.
type model struct {
count int
}
// 2. Init (التهيئة) — يُرجع الأمر الأولي (عادةً nil).
func (m model) Init() tea.Cmd {
return nil
}
// 3. Update (التحديث) — يعالج الرسائل الواردة ويُرجِع النموذج الجديد والأمر.
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
switch msg.String() {
case "ctrl+c":
return m, tea.Quit // أمر للخروج
default:
m.count++
return m, nil
}
}
return m, nil
}
// 4. View (العرض) — يُرجِع النص الذي سيتم عرضه في الطرفية.
func (m model) View() string {
return fmt.Sprintf("عدد الضغطات: %d\n\nاضغط أي مفتاح. للخروج اضغط Ctrl+C.", m.count)
}
func main() {
p := tea.NewProgram(model{})
if _, err := p.Run(); err != nil {
fmt.Printf("خطأ: %v", err)
os.Exit(1)
}
}
قم بتشغيل التطبيق:
go run main.go
4. أهم الدوال والأنواع
في Bubble Tea، العناصر الأساسية هي الواجهات (Interfaces) والدوال (Functions)، وليست الكلاسات. دعنا نستعرض 8 عناصر رئيسية.
4.1. tea.NewProgram
التوقيع: func NewProgram(