Service Sequences as Code — מייצר קוד שירות מ-DSL הערות Go.

לוגיקת שירות היא סדרה של החלטות: איזה מודל לשאול, ממה להתגונן, מתי לדחות, מה להחזיר. ההחלטות האלה שייכות למי שמבין את העסק — אבל הן נקברות בקוד תבניתי, מפוזרות בין שכבות ואובדות בשכתובים.

SSaC שומר את ההחלטות האלה כמפרט הצהרתי. אתה מצהיר מה קורה ובאיזה סדר. הכלי מייצר את המימוש.

specs/service/*.go  →  ssac validate  →  ssac gen  →  artifacts/service/*.go

GitHub

רעיון מרכזי

כל פונקציית שירות היא רצף של צעדים. כל צעד עוקב אחר חוזה בינארי: הצלחה → השורה הבאה, כישלון → return. זו לא הפשטה שהמצאנו — כך לוגיקת שירות כבר עובדת. SSaC הופך את זה למפורש.

10 סוגי רצף קבועים מכסים את כל פעולות שכבת השירות שעוקבות אחר חוזה זה. מה שלא מתאים מואצל ל-call. הקבוצה סגורה בתכנון.

ללא LLM, ללא הסקה — יצירת קוד סמלית טהורה מתבניות. המפרט הוא מקור האמת היחיד.

דוגמה

// @sequence get
// @model Project.FindByID
// @param ProjectID request
// @result project Project

// @sequence guard nil project
// @message "project not found"

// @sequence post
// @model Session.Create
// @param ProjectID request
// @param Command request
// @result session Session

// @sequence response json
// @var session
func CreateSession(w http.ResponseWriter, r *http.Request) {}

הצהרה זו בת 10 שורות מייצרת את הקוד הבא:

func CreateSession(w http.ResponseWriter, r *http.Request) {
    projectID := r.FormValue("ProjectID")
    command := r.FormValue("Command")

    project, err := projectModel.FindByID(projectID)
    if err != nil {
        http.Error(w, "Project lookup failed", http.StatusInternalServerError)
        return
    }

    if project == nil {
        http.Error(w, "project not found", http.StatusNotFound)
        return
    }

    session, err := sessionModel.Create(projectID, command)
    if err != nil {
        http.Error(w, "Session creation failed", http.StatusInternalServerError)
        return
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(map[string]interface{}{
        "session": session,
    })
}

סוגי רצף (10)

סוגתפקיד
authorizeבדיקת הרשאות (OPA וכו')
getחיפוש משאב
guard nilיציאה אם null
guard existsיציאה אם קיים
postיצירת משאב
putעדכון משאב
deleteמחיקת משאב
passwordהשוואת סיסמה
callקריאה חיצונית (@component / @func)
responseהחזרת תגובה (json)

תכונות יצירת קוד

/api/reservations:
  get:
    operationId: ListReservations
    x-pagination:
      style: offset
      defaultLimit: 20
      maxLimit: 100
    x-sort:
      allowed: [start_at, created_at]
      default: start_at
      direction: desc
    x-filter:
      allowed: [status, room_id]
    x-include:
      allowed: [room, user]

רישיון

MIT — GitHub