schema generator working
This commit is contained in:
		@@ -2,54 +2,60 @@ package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/invopop/jsonschema"
 | 
			
		||||
	"go.balki.me/tss/app"
 | 
			
		||||
	"gopkg.in/yaml.v3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func fix(s string) string {
 | 
			
		||||
	// s := "go.balki.me/tss/home/balki/projects/tss/app.Config.Proxy"
 | 
			
		||||
	return fmt.Sprintf("%s%s", s[:16], s[40:])
 | 
			
		||||
}
 | 
			
		||||
var refsDoc = `Placeholder to put any yaml anchors to use elsewhere, E.g.
 | 
			
		||||
refs:
 | 
			
		||||
  myvpsproxy: &myvpsproxy "socks5://vps.example.com:1080"
 | 
			
		||||
  twiceaday: &twiceaday "00 1,13 * * *"`
 | 
			
		||||
 | 
			
		||||
type config struct {
 | 
			
		||||
	app.Config
 | 
			
		||||
 | 
			
		||||
	// Placeholder to put any yaml anchors to use elsewhere, E.g.
 | 
			
		||||
	// refs:
 | 
			
		||||
	//   myvpsproxy: &myvpsproxy "socks5://vps.example.com:1080"
 | 
			
		||||
	//   twiceaday: &twiceaday "00 1,13 * * *"
 | 
			
		||||
	Refs map[string]any `yaml:"refs" jsonschema:"refs"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	// "go.balki.me/tss/app.FeedCfg.Channel": "Telegram channel name in the form \"@foobar\" or \"-1004242442\"",
 | 
			
		||||
	//s go.balki.me/tss/app.FeedCfg.Channel
 | 
			
		||||
	// foo()
 | 
			
		||||
	// return
 | 
			
		||||
	fmt.Println("vim-go")
 | 
			
		||||
	cmmap := map[string]string{}
 | 
			
		||||
	err := jsonschema.ExtractGoComments("go.balki.me/tss", "/home/balki/projects/tss", cmmap)
 | 
			
		||||
	cmmapF := map[string]string{}
 | 
			
		||||
	for k, v := range cmmap {
 | 
			
		||||
		cmmapF[fix(k)] = v
 | 
			
		||||
	}
 | 
			
		||||
	cmmap = cmmapF
 | 
			
		||||
	fmt.Println("err", err)
 | 
			
		||||
	d, err := json.Marshal(cmmap)
 | 
			
		||||
	fmt.Printf("%s\n", string(d))
 | 
			
		||||
	os.WriteFile("/tmp/cmmap.json", d, 0644)
 | 
			
		||||
	var c config
 | 
			
		||||
	r := jsonschema.Reflector{
 | 
			
		||||
		RequiredFromJSONSchemaTags: true,
 | 
			
		||||
		DoNotReference:             true,
 | 
			
		||||
		ExpandedStruct:             true,
 | 
			
		||||
		CommentMap:                 cmmap,
 | 
			
		||||
	}
 | 
			
		||||
	s := r.Reflect(c)
 | 
			
		||||
	j, _ := json.Marshal(s)
 | 
			
		||||
	os.WriteFile("/home/balki/projects/tss/docs/schema.json", j, 0644)
 | 
			
		||||
	fmt.Println(string(j))
 | 
			
		||||
	err := r.AddGoComments("go.balki.me/tss", ".")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	r.CommentMap["main.config.Refs"] = refsDoc
 | 
			
		||||
 | 
			
		||||
	s := r.Reflect(config{})
 | 
			
		||||
	j, err := json.Marshal(s)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = os.WriteFile("./docs/schema.json", j, 0644)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var a any
 | 
			
		||||
	err = yaml.Unmarshal(j, &a)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	y, err := yaml.Marshal(a)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = os.WriteFile("./docs/schema.yaml", y, 0644)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
{"$schema":"http://json-schema.org/draft/2020-12/schema","properties":{"proxy":{"type":"string","description":"default proxy url that http.Client can understand\nor socks5://unix/path/to/sock for socks proxy over unix socket\nempty for no proxy","default":""},"telegram_proxy":{"type":"string","description":"proxy for telegram if different from default\nNONE to not use global default","default":"\u003cglobal proxy\u003e"},"telegram_auth_token":{"type":"string","description":"Auth token for telegram in the form of 424242424:AB02132skdcjlisjkjflewjlfkjslkfHHXX"},"data_dir":{"type":"string","description":"Base directory to write feed data and schedule file","default":"./"},"last_loaded_path":{"type":"string","description":"Path to the file where last success time for each feed is saved","default":"\u003cdatadir\u003e/last_success.yml"},"db_dir":{"type":"string","description":"Path to the directory where feed content is saved","default":"\u003cdatadir\u003e/feed_data"},"first_time_limit":{"type":"integer","description":"Number of entries to process when the feed is seen for the first time\n-1 means no limit","default":-1},"feeds":{"items":{"properties":{"name":{"type":"string","description":"Unique identifier for the feed. Used as filename, so keep it simple"},"channel":{"type":"string","description":"Telegram channel name in the form \"@foobar\" or \"-1004242442\" (private)"},"rhash":{"type":"string","description":"Telegram instant view rhash id, see https://instantview.telegram.org/#publishing-templates","default":""},"url":{"oneOf":[{"type":"string"},{"type":"array"}],"items":{"type":"string"},"description":"Feed Url, string or array of strings\nIf array, all entries are merged, e.g [\"https://example.com/blog/tag/foo/feed\", \"https://example.com/blog/tag/bar/feed\" ]"},"cron":{"type":"string","description":"Cron expression, see https://pkg.go.dev/github.com/robfig/cron#hdr-CRON_Expression_Format"},"proxy":{"type":"string","description":"Proxy for this feed if different from global","default":"\u003cglobal proxy\u003e"},"type":{"type":"string","enum":["rss","atom"],"description":"Rss or Atom feed"},"title":{"type":"string","description":"Text of the link sent to telegram,","default":"Link"},"first_time_limit":{"type":"integer","description":"Number of entries to process when the feed is seen for the first time","default":0}},"additionalProperties":false,"type":"object","required":["name","channel","url","cron","type"]},"type":"array","description":"Feed config"},"refs":{"type":"object"}},"additionalProperties":false,"type":"object","required":["telegram_auth_token","feeds"]}
 | 
			
		||||
{"$schema":"http://json-schema.org/draft/2020-12/schema","properties":{"proxy":{"type":"string","description":"default proxy url that http.Client can understand\nor socks5://unix/path/to/sock for socks proxy over unix socket\nempty for no proxy","default":""},"telegram_proxy":{"type":"string","description":"proxy for telegram if different from default\nNONE to not use global default","default":"\u003cglobal proxy\u003e"},"telegram_auth_token":{"type":"string","description":"Auth token for telegram in the form of 424242424:AB02132skdcjlisjkjflewjlfkjslkfHHXX"},"data_dir":{"type":"string","description":"Base directory to write feed data and schedule file","default":"./"},"last_loaded_path":{"type":"string","description":"Path to the file where last success time for each feed is saved","default":"\u003cdatadir\u003e/last_success.yml"},"db_dir":{"type":"string","description":"Path to the directory where feed content is saved","default":"\u003cdatadir\u003e/feed_data"},"first_time_limit":{"type":"integer","description":"Number of entries to process when the feed is seen for the first time\n-1 means no limit","default":-1},"feeds":{"items":{"properties":{"name":{"type":"string","description":"Unique identifier for the feed. Used as filename, so keep it simple"},"channel":{"type":"string","description":"Telegram channel name in the form \"@foobar\" or \"-1004242442\" (private)"},"rhash":{"type":"string","description":"Telegram instant view rhash id, see https://instantview.telegram.org/#publishing-templates","default":""},"url":{"oneOf":[{"type":"string"},{"type":"array"}],"items":{"type":"string"},"description":"Feed URL, string or array of strings\nIf array, all entries are merged, e.g [\"https://example.com/blog/tag/foo/feed\", \"https://example.com/blog/tag/bar/feed\" ]"},"cron":{"type":"string","description":"Cron expression, see https://pkg.go.dev/github.com/robfig/cron#hdr-CRON_Expression_Format"},"proxy":{"type":"string","description":"Proxy for this feed if different from global","default":"\u003cglobal proxy\u003e"},"type":{"type":"string","enum":["rss","atom"],"description":"Rss or Atom feed"},"title":{"type":"string","description":"Text of the link sent to telegram,","default":"Link"},"first_time_limit":{"type":"integer","description":"Number of entries to process when the feed is seen for the first time","default":0}},"additionalProperties":false,"type":"object","required":["name","channel","url","cron","type"]},"type":"array","description":"Feed config"},"refs":{"type":"object","description":"Placeholder to put any yaml anchors to use elsewhere, E.g.\nrefs:\n  myvpsproxy: \u0026myvpsproxy \"socks5://vps.example.com:1080\"\n  twiceaday: \u0026twiceaday \"00 1,13 * * *\""}},"additionalProperties":false,"type":"object","required":["telegram_auth_token","feeds"]}
 | 
			
		||||
							
								
								
									
										191
									
								
								docs/schema.yaml
									
									
									
									
									
								
							
							
						
						
									
										191
									
								
								docs/schema.yaml
									
									
									
									
									
								
							@@ -1,96 +1,101 @@
 | 
			
		||||
$schema: http://json-schema.org/draft/2020-12/schema
 | 
			
		||||
properties:
 | 
			
		||||
  proxy:
 | 
			
		||||
    type: string
 | 
			
		||||
    description: |-
 | 
			
		||||
      default proxy url that http.Client can understand
 | 
			
		||||
      or socks5://unix/path/to/sock for socks proxy over unix socket
 | 
			
		||||
      empty for no proxy
 | 
			
		||||
    default: ""
 | 
			
		||||
  telegram_proxy:
 | 
			
		||||
    type: string
 | 
			
		||||
    description: |-
 | 
			
		||||
      proxy for telegram if different from default
 | 
			
		||||
      NONE to not use global default
 | 
			
		||||
    default: <global proxy>
 | 
			
		||||
  telegram_auth_token:
 | 
			
		||||
    type: string
 | 
			
		||||
    description: Auth token for telegram in the form of 424242424:AB02132skdcjlisjkjflewjlfkjslkfHHXX
 | 
			
		||||
  data_dir:
 | 
			
		||||
    type: string
 | 
			
		||||
    description: Base directory to write feed data and schedule file
 | 
			
		||||
    default: ./
 | 
			
		||||
  last_loaded_path:
 | 
			
		||||
    type: string
 | 
			
		||||
    description: Path to the file where last success time for each feed is saved
 | 
			
		||||
    default: <datadir>/last_success.yml
 | 
			
		||||
  db_dir:
 | 
			
		||||
    type: string
 | 
			
		||||
    description: Path to the directory where feed content is saved
 | 
			
		||||
    default: <datadir>/feed_data
 | 
			
		||||
  first_time_limit:
 | 
			
		||||
    type: integer
 | 
			
		||||
    description: |-
 | 
			
		||||
      Number of entries to process when the feed is seen for the first time
 | 
			
		||||
      -1 means no limit
 | 
			
		||||
    default: -1
 | 
			
		||||
  feeds:
 | 
			
		||||
    items:
 | 
			
		||||
      properties:
 | 
			
		||||
        name:
 | 
			
		||||
          type: string
 | 
			
		||||
          description: Unique identifier for the feed. Used as filename, so keep it simple
 | 
			
		||||
        channel:
 | 
			
		||||
          type: string
 | 
			
		||||
          description: Telegram channel name in the form "@foobar" or "-1004242442" (private)
 | 
			
		||||
        rhash:
 | 
			
		||||
          type: string
 | 
			
		||||
          description: Telegram instant view rhash id, see https://instantview.telegram.org/#publishing-templates
 | 
			
		||||
          default: ""
 | 
			
		||||
        url:
 | 
			
		||||
          oneOf:
 | 
			
		||||
            - type: string
 | 
			
		||||
            - type: array
 | 
			
		||||
          items:
 | 
			
		||||
            type: string
 | 
			
		||||
          description: |-
 | 
			
		||||
            Feed Url, string or array of strings
 | 
			
		||||
            If array, all entries are merged, e.g ["https://example.com/blog/tag/foo/feed", "https://example.com/blog/tag/bar/feed" ]
 | 
			
		||||
        cron:
 | 
			
		||||
          type: string
 | 
			
		||||
          description: "Cron expression, see https://pkg.go.dev/github.com/robfig/cron#hdr-CRON_Expression_Format"
 | 
			
		||||
        proxy:
 | 
			
		||||
          type: string
 | 
			
		||||
          description: Proxy for this feed if different from global
 | 
			
		||||
          default: <global proxy>
 | 
			
		||||
        type:
 | 
			
		||||
          type: string
 | 
			
		||||
          enum:
 | 
			
		||||
            - rss
 | 
			
		||||
            - atom
 | 
			
		||||
          description: Rss or Atom feed
 | 
			
		||||
        title:
 | 
			
		||||
          type: string
 | 
			
		||||
          description: Text of the link sent to telegram,
 | 
			
		||||
          default: Link
 | 
			
		||||
        first_time_limit:
 | 
			
		||||
          type: integer
 | 
			
		||||
          description: Number of entries to process when the feed is seen for the first time
 | 
			
		||||
          default: 0
 | 
			
		||||
      additionalProperties: false
 | 
			
		||||
      type: object
 | 
			
		||||
      required:
 | 
			
		||||
        - name
 | 
			
		||||
        - channel
 | 
			
		||||
        - url
 | 
			
		||||
        - cron
 | 
			
		||||
        - type
 | 
			
		||||
    type: array
 | 
			
		||||
    description: Feed config
 | 
			
		||||
  refs:
 | 
			
		||||
    type: object
 | 
			
		||||
additionalProperties: false
 | 
			
		||||
type: object
 | 
			
		||||
properties:
 | 
			
		||||
    data_dir:
 | 
			
		||||
        default: ./
 | 
			
		||||
        description: Base directory to write feed data and schedule file
 | 
			
		||||
        type: string
 | 
			
		||||
    db_dir:
 | 
			
		||||
        default: <datadir>/feed_data
 | 
			
		||||
        description: Path to the directory where feed content is saved
 | 
			
		||||
        type: string
 | 
			
		||||
    feeds:
 | 
			
		||||
        description: Feed config
 | 
			
		||||
        items:
 | 
			
		||||
            additionalProperties: false
 | 
			
		||||
            properties:
 | 
			
		||||
                channel:
 | 
			
		||||
                    description: Telegram channel name in the form "@foobar" or "-1004242442" (private)
 | 
			
		||||
                    type: string
 | 
			
		||||
                cron:
 | 
			
		||||
                    description: Cron expression, see https://pkg.go.dev/github.com/robfig/cron#hdr-CRON_Expression_Format
 | 
			
		||||
                    type: string
 | 
			
		||||
                first_time_limit:
 | 
			
		||||
                    default: 0
 | 
			
		||||
                    description: Number of entries to process when the feed is seen for the first time
 | 
			
		||||
                    type: integer
 | 
			
		||||
                name:
 | 
			
		||||
                    description: Unique identifier for the feed. Used as filename, so keep it simple
 | 
			
		||||
                    type: string
 | 
			
		||||
                proxy:
 | 
			
		||||
                    default: <global proxy>
 | 
			
		||||
                    description: Proxy for this feed if different from global
 | 
			
		||||
                    type: string
 | 
			
		||||
                rhash:
 | 
			
		||||
                    default: ""
 | 
			
		||||
                    description: Telegram instant view rhash id, see https://instantview.telegram.org/#publishing-templates
 | 
			
		||||
                    type: string
 | 
			
		||||
                title:
 | 
			
		||||
                    default: Link
 | 
			
		||||
                    description: Text of the link sent to telegram,
 | 
			
		||||
                    type: string
 | 
			
		||||
                type:
 | 
			
		||||
                    description: Rss or Atom feed
 | 
			
		||||
                    enum:
 | 
			
		||||
                        - rss
 | 
			
		||||
                        - atom
 | 
			
		||||
                    type: string
 | 
			
		||||
                url:
 | 
			
		||||
                    description: |-
 | 
			
		||||
                        Feed URL, string or array of strings
 | 
			
		||||
                        If array, all entries are merged, e.g ["https://example.com/blog/tag/foo/feed", "https://example.com/blog/tag/bar/feed" ]
 | 
			
		||||
                    items:
 | 
			
		||||
                        type: string
 | 
			
		||||
                    oneOf:
 | 
			
		||||
                        - type: string
 | 
			
		||||
                        - type: array
 | 
			
		||||
            required:
 | 
			
		||||
                - name
 | 
			
		||||
                - channel
 | 
			
		||||
                - url
 | 
			
		||||
                - cron
 | 
			
		||||
                - type
 | 
			
		||||
            type: object
 | 
			
		||||
        type: array
 | 
			
		||||
    first_time_limit:
 | 
			
		||||
        default: -1
 | 
			
		||||
        description: |-
 | 
			
		||||
            Number of entries to process when the feed is seen for the first time
 | 
			
		||||
            -1 means no limit
 | 
			
		||||
        type: integer
 | 
			
		||||
    last_loaded_path:
 | 
			
		||||
        default: <datadir>/last_success.yml
 | 
			
		||||
        description: Path to the file where last success time for each feed is saved
 | 
			
		||||
        type: string
 | 
			
		||||
    proxy:
 | 
			
		||||
        default: ""
 | 
			
		||||
        description: |-
 | 
			
		||||
            default proxy url that http.Client can understand
 | 
			
		||||
            or socks5://unix/path/to/sock for socks proxy over unix socket
 | 
			
		||||
            empty for no proxy
 | 
			
		||||
        type: string
 | 
			
		||||
    refs:
 | 
			
		||||
        description: |-
 | 
			
		||||
            Placeholder to put any yaml anchors to use elsewhere, E.g.
 | 
			
		||||
            refs:
 | 
			
		||||
              myvpsproxy: &myvpsproxy "socks5://vps.example.com:1080"
 | 
			
		||||
              twiceaday: &twiceaday "00 1,13 * * *"
 | 
			
		||||
        type: object
 | 
			
		||||
    telegram_auth_token:
 | 
			
		||||
        description: Auth token for telegram in the form of 424242424:AB02132skdcjlisjkjflewjlfkjslkfHHXX
 | 
			
		||||
        type: string
 | 
			
		||||
    telegram_proxy:
 | 
			
		||||
        default: <global proxy>
 | 
			
		||||
        description: |-
 | 
			
		||||
            proxy for telegram if different from default
 | 
			
		||||
            NONE to not use global default
 | 
			
		||||
        type: string
 | 
			
		||||
required:
 | 
			
		||||
  - telegram_auth_token
 | 
			
		||||
  - feeds
 | 
			
		||||
    - telegram_auth_token
 | 
			
		||||
    - feeds
 | 
			
		||||
type: object
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user