~emersion/drmdb

6fd51a855761ee3ae56a85e4a4e2d0d48966a6cb — Simon Ser 1 year, 4 months ago 9a64137
Properly handle props with same name but different object type
2 files changed, 24 insertions(+), 8 deletions(-)

M public/properties.html
M server.go
M public/properties.html => public/properties.html +2 -2
@@ 17,10 17,10 @@
          </tr>
      </thead>
      <tbody>
          {{range $name, $prop := .Properties}}
          {{range $prop := .Properties}}
          <tr>
              <td class="pre">
                  <a href="/properties/{{printf "%d" $prop.ObjectType}}/{{$name}}">{{$name}}</a>
                  <a href="/properties/{{printf "%d" $prop.ObjectType}}/{{$prop.Name}}">{{$prop.Name}}</a>
              </td>
              <td>{{$prop.Type}}</td>
              <td><a href="?object-type={{printf "%d" $prop.ObjectType}}" title="Only show {{$prop.ObjectType}} properties">

M server.go => server.go +22 -6
@@ 338,6 338,7 @@ func New() *echo.Echo {

	e.GET("/properties", func(c echo.Context) error {
		type propertyData struct {
			Name       string
			Type       drm.PropertyType
			ObjectType drm.ObjectType
			Drivers    map[string]bool


@@ 354,8 355,13 @@ func New() *echo.Echo {

		driverName := c.QueryParam("driver")

		type propKey struct {
			Name       string
			ObjectType drm.ObjectType
		}

		drivers := make(map[string]struct{})
		props := make(map[string]propertyData)
		props := make(map[propKey]propertyData)
		err := db.Walk(func(k string, n *drmtree.Node) error {
			drv := n.Driver.Name
			if driverName != "" && drv != driverName {


@@ 368,14 374,16 @@ func New() *echo.Echo {
				if objectType != drm.ObjectAny && obj.Type() != objectType {
					return nil
				}
				if _, ok := props[name]; !ok {
					props[name] = propertyData{
				k := propKey{name, obj.Type()}
				if _, ok := props[k]; !ok {
					props[k] = propertyData{
						Name:       name,
						Type:       prop.Type,
						ObjectType: obj.Type(),
						Drivers:    make(map[string]bool),
					}
				}
				props[name].Drivers[drv] = true
				props[k].Drivers[drv] = true
				return nil
			})
		})


@@ 383,10 391,18 @@ func New() *echo.Echo {
			return err
		}

		propList := make([]propertyData, 0, len(props))
		for _, prop := range props {
			propList = append(propList, prop)
		}
		sort.Slice(propList, func(i, j int) bool {
			return propList[i].Name < propList[j].Name
		})

		return c.Render(http.StatusOK, "properties.html", struct {
			Drivers    map[string]struct{}
			Properties map[string]propertyData
		}{drivers, props})
			Properties []propertyData
		}{drivers, propList})
	})

	e.GET("/properties/:obj/:name", func(c echo.Context) error {