Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /usr/share/doc/snapd/ |
Upload File : |
package main import ( "fmt" "go/ast" "go/doc" "go/parser" "go/token" "os" "sort" "strconv" "strings" ) const ( errorKindsHdr = `## <h3 id='heading--errors'>Error kinds</h3>` maintErrorKindsHdr = `## <h4 id='heading--maint-errors'>Maintenance error kinds</h4> These are used only inside the ` + "`maintenance` field of responses." ) func fail(err error) { fmt.Fprintf(os.Stderr, "error: %v", err) os.Exit(1) } func main() { fset := token.NewFileSet() pkgs, err := parser.ParseDir(fset, "../client", nil, parser.ParseComments) if err != nil { fail(err) } p := doc.New(pkgs["client"], "github.com/snapcore/snapd/client", 0) var errorKindT *doc.Type for _, t := range p.Types { if t.Name == "ErrorKind" { errorKindT = t break } } if errorKindT == nil { fail(fmt.Errorf("expected ErrorKind type not defined")) } for _, c := range errorKindT.Consts { if strings.HasPrefix(c.Doc, "Error kinds.") { fmt.Println(errorKindsHdr) } else if strings.HasPrefix(c.Doc, "Maintenance error kinds") { fmt.Println() fmt.Println(maintErrorKindsHdr) } else { fmt.Fprintf(os.Stderr, "unexpected error kind group: %v\n", c.Doc) continue } fmt.Println() kinds := make([]string, 0, len(c.Decl.Specs)) docs := make(map[string]string, len(c.Decl.Specs)) for _, spec := range c.Decl.Specs { vs, ok := spec.(*ast.ValueSpec) if !ok { fmt.Printf("%#v\n", spec) continue } kind, err := strconv.Unquote(vs.Values[0].(*ast.BasicLit).Value) if err != nil { // unexpected fail(err) } doc := vs.Doc.Text() name := vs.Names[0] pfx := name.String() + ":" if !strings.HasPrefix(doc, pfx) { fmt.Fprintf(os.Stderr, "expected %s: doc string prefix, got %q\n", name, doc) } else { doc = doc[len(pfx):] } doc = strings.Replace(doc, "\n", " ", -1) doc = strings.Replace(doc, " ", " ", -1) doc = strings.TrimSpace(doc) if !strings.HasSuffix(doc, ".") { fmt.Fprintf(os.Stderr, "expected dot at the end %q for %s\n", doc, name) } if strings.HasPrefix(doc, "deprecated") { // skip continue } if doc == "" { doc = name.String() + "..." } kinds = append(kinds, kind) docs[kind] = doc } sort.Strings(kinds) for _, kind := range kinds { fmt.Printf("* `%s`: %s\n", kind, docs[kind]) } } }