Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

catalog.gno

3.16 Kb · 98 lines
 1package gallery
 2
 3import (
 4	"gno.land/r/moul/demo/gnoface/v0"
 5	"gno.land/r/moul/demo/millipede/v0"
 6	"gno.land/r/moul/sapin/v0"
 7)
 8
 9// piece is one entry in the index.
10//
11// The gallery stores no art. Every piece lives in somebody's realm and this is
12// a pointer to it, which is why there is no package-level state anywhere in
13// this realm and nothing here survives or needs to survive a redeploy.
14type piece struct {
15	Slug    string
16	Title   string
17	Author  string
18	Origin  string // realm path, without the gno.land prefix
19	License string
20	Note    string
21
22	// Draw renders the piece live, by importing its source. It is nil when the
23	// source cannot be imported, which is the honest half of a curated index:
24	// a private realm or a package this repo has not vendored can be pointed
25	// at but not shown.
26	Draw func() string
27}
28
29// Live reports whether this realm can render the piece itself.
30func (p piece) Live() bool { return p.Draw != nil }
31
32// catalog is built per call rather than held in a package-level var: a func
33// value is not something to persist, and a realm that stores nothing should
34// not be paying storage for its own index.
35func catalog() []piece {
36	return []piece{
37		{
38			Slug:    "gnoface",
39			Title:   "gnoface",
40			Author:  "moul",
41			Origin:  "r/moul/demo/gnoface/v0",
42			License: "see the source realm",
43			Note:    "A face generated from a seed. Every seed is a different face, and none of them are stored.",
44			Draw:    func() string { return gnoface.Draw(42) },
45		},
46		{
47			Slug:    "millipede",
48			Title:   "millipede",
49			Author:  "moul",
50			Origin:  "r/moul/demo/millipede/v0",
51			License: "see the source realm",
52			Note:    "A millipede of any length. The oldest piece here, and still the one that best explains why ASCII is the cheapest picture there is.",
53			Draw:    func() string { return millipede.Draw(8) },
54		},
55		{
56			Slug:    "sapin",
57			Title:   "sapin",
58			Author:  "moul",
59			Origin:  "r/moul/sapin/v0",
60			License: "see the source realm",
61			Note:    "A fir tree, sized on request.",
62			Draw:    func() string { return sapin.Sapin(6) },
63		},
64		{
65			Slug:    "settler25",
66			Title:   "Settler #25",
67			Author:  "the Settlers",
68			Origin:  "r/g17khqpukees4237dtn3astzapmp462vjhsz6st4/settlers/nft",
69			License: "CC0 1.0",
70			Note:    "moul's, soulbound, minted at block 409242. A 32x32 indexed sprite with 20 colours, which is what made it the test case for p/moul/art: a luminance ramp resolves those 20 to 9, and keying on the palette index keeps all 20.",
71		},
72		{
73			Slug:    "asciiart",
74			Title:   "asciiart",
75			Author:  "moul",
76			Origin:  "r/moul/x/daily/asciiart/v1",
77			License: "see the source realm",
78			Note:    "Patterns from short deterministic algorithms, plus everyone's generations. Declared private = true, so it can be linked but never imported: that is the constraint, not an omission.",
79		},
80		{
81			Slug:    "pixelcanvas",
82			Title:   "pixelcanvas",
83			Author:  "moul",
84			Origin:  "r/moul/x/daily/pixelcanvas/v0",
85			License: "see the source realm",
86			Note:    "A shared grid anyone can paint one pixel of.",
87		},
88	}
89}
90
91func find(slug string) (piece, bool) {
92	for _, p := range catalog() {
93		if p.Slug == slug {
94			return p, true
95		}
96	}
97	return piece{}, false
98}