diff --git a/writeskeleframe.go b/writeskeleframe.go new file mode 100644 index 0000000..d23c86b --- /dev/null +++ b/writeskeleframe.go @@ -0,0 +1,70 @@ +package frameproto + +import ( + "io" +) + +const skeleFrameTop = + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n" + +const skeleFrameBotton = + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n" + +// WriteSkeleFrame takes care of creating a skeleton-HTML-page that the Frame-Protocol's (i.e., Farcaster Frame's) tags are included in. +// +// For example, this: +// +// frameproto.WriteSkeleFrame(w, func(writer io.Writer){ +// +// // This will write: +// // +// frameproto.WriteFrame(writer, frameproto.VersionVNext) +// +// // This will write: +// +// var imgURL string = "https://example.com/path/to/img.png" +// frameproto.WriteFrameImage(writer, imgURL) +// }) +// +// Would write this: +// +// +// +// +// +// +// +// +// +// +// +// Note that http.ResponseWriter is an io.Writer. So this function can be used to write to http.ResponseWriter. +func WriteSkeleFrame(writer io.Writer, frameWriterFunc func(io.Writer)error) error { + + var err error + + _, err = io.WriteString(writer, skeleFrameTop) + if nil != err { + return err + } + + err = frameWriterFunc(writer) + if nil != err { + return err + } + + _, err = io.WriteString(writer, skeleFrameBotton) + if nil != err { + return err + } + + return nil +} + diff --git a/writeskeleframe_test.go b/writeskeleframe_test.go new file mode 100644 index 0000000..da13c7f --- /dev/null +++ b/writeskeleframe_test.go @@ -0,0 +1,113 @@ + +package frameproto + +import ( + "testing" + + "io" + "strings" +) + +func TestWriteSkeleFrame(t *testing.T) { + + tests := []struct{ + Head string + Expected string + }{ + { + Head: "", + Expected: + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n", + }, + + + + { + Head: ``+"\n", + Expected: + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + + ``+"\n"+ + + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n", + }, + + + + { + Head: ``+"\n", + Expected: + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + + ``+"\n"+ + + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n", + }, + + + + { + Head: + ``+"\n"+ + ``+"\n"+ + ``+"\n", + Expected: + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + + ``+"\n"+ + ``+"\n"+ + ``+"\n"+ + ``+"\n", + }, + } + + for testNumber, test := range tests { + + var buffer strings.Builder + + WriteSkeleFrame(&buffer, func(writer io.Writer)error { + io.WriteString(writer, test.Head) + return nil + }) + + expected := test.Expected + actual := buffer.String() + + if expected != actual { + t.Errorf("For test #%d, ", testNumber) + t.Logf("EXPECTED:\n%s", expected) + t.Logf("ACTUAL:\n%s", actual) + t.Logf("EXPECTED: %q", expected) + t.Logf("ACTUAL: %q", actual) + t.Logf("HEAD:\n%s", test.Head) + t.Logf("HEAD: %q", test.Head) + continue + } + } +}