From 1e6e8f23f67f9aff77268f54a9228ff601f5ab86 Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Thu, 14 Dec 2023 03:37:34 +0900 Subject: [PATCH 01/14] build: update dependent versions --- go.mod | 6 +++--- go.sum | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index be551a4..2504828 100644 --- a/go.mod +++ b/go.mod @@ -14,9 +14,9 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/crypto v0.15.0 // indirect - golang.org/x/net v0.18.0 // indirect - golang.org/x/sys v0.14.0 // indirect + golang.org/x/crypto v0.16.0 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 218d3ca..425a5d5 100644 --- a/go.sum +++ b/go.sum @@ -28,14 +28,19 @@ golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= From 348818664aa31299b79a1180219bce727657dc9f Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Tue, 19 Dec 2023 07:24:08 +0900 Subject: [PATCH 02/14] refactor: MessageBubbleBlock to BubbleBlock --- kakaowork/Block.go | 7 ------- kakaowork/ButtonAction.go | 2 +- kakaowork/Message.go | 20 ++++++++++++++++++++ kakaowork/TextInline.go | 2 +- 4 files changed, 22 insertions(+), 9 deletions(-) delete mode 100644 kakaowork/Block.go create mode 100644 kakaowork/Message.go diff --git a/kakaowork/Block.go b/kakaowork/Block.go deleted file mode 100644 index ddcd460..0000000 --- a/kakaowork/Block.go +++ /dev/null @@ -1,7 +0,0 @@ -package kakaowork - -type MessageBubbleBlock interface { - Type() string - String() string - MarshalJSON() ([]byte, error) -} diff --git a/kakaowork/ButtonAction.go b/kakaowork/ButtonAction.go index 2626c88..9f346b6 100644 --- a/kakaowork/ButtonAction.go +++ b/kakaowork/ButtonAction.go @@ -3,7 +3,7 @@ package kakaowork import "encoding/json" type ButtonAction interface { - MessageBubbleBlock + BubbleBlock ActionType() string } diff --git a/kakaowork/Message.go b/kakaowork/Message.go new file mode 100644 index 0000000..67c867e --- /dev/null +++ b/kakaowork/Message.go @@ -0,0 +1,20 @@ +package kakaowork + +// BubbleBlock is type casting interface for Message.Blocks. +// Implementing structs should expose only customizable properties. +// Other fixed properties should be handled during marshaling to JSON. +type BubbleBlock interface { + // Type returns the message block type, equivalent to the JSON "type" property's value. + Type() string + // String is required for struct conversion fallback and value identification. + String() string + // MarshalJSON is overridden to hide fixed properties, like the "type" property. + MarshalJSON() ([]byte, error) +} + +type Message struct { + // Preview describes simple text for notification and chat preview. + Preview string `json:"text"` + // Blocks describes the actual message contents. + Blocks []BubbleBlock `json:"blocks"` +} diff --git a/kakaowork/TextInline.go b/kakaowork/TextInline.go index e1c561c..ba4cadb 100644 --- a/kakaowork/TextInline.go +++ b/kakaowork/TextInline.go @@ -5,7 +5,7 @@ import "encoding/json" // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#inlines type Inline interface { - MessageBubbleBlock + BubbleBlock InlineType() string } From 158eeac196f76c39d842fa8ed11eaea8f2e344b9 Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Sun, 31 Dec 2023 12:31:33 +0900 Subject: [PATCH 03/14] refactor: rename examples to MarshalJSON --- kakaowork/ButtonAction_example_test.go | 163 +++++++++------------ kakaowork/ContextBlock_example_test.go | 34 ++--- kakaowork/DescriptionBlock_example_test.go | 30 ++-- kakaowork/DividerBlock_example_test.go | 6 +- kakaowork/HeaderBlock_example_test.go | 10 +- kakaowork/ImageBlock_example_test.go | 8 +- kakaowork/SectionBlock_example_test.go | 62 ++++---- kakaowork/TextBlock_example_test.go | 82 +++++------ kakaowork/TextInline_example_test.go | 90 ++++++------ 9 files changed, 228 insertions(+), 257 deletions(-) diff --git a/kakaowork/ButtonAction_example_test.go b/kakaowork/ButtonAction_example_test.go index ee4ad57..78fc16a 100644 --- a/kakaowork/ButtonAction_example_test.go +++ b/kakaowork/ButtonAction_example_test.go @@ -6,7 +6,7 @@ import ( "github.com/JSYoo5B/convertago/kakaowork" ) -func ExampleOpenSystemBrowserAction() { +func ExampleOpenSystemBrowserAction_MarshalJSON() { buttonBlock := kakaowork.ButtonBlock{ Text: "자세히보기", Style: kakaowork.ButtonStylePrimary, @@ -16,7 +16,7 @@ func ExampleOpenSystemBrowserAction() { }, } - jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") + jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -24,47 +24,18 @@ func ExampleOpenSystemBrowserAction() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "button", - // "text": "자세히보기", - // "style": "primary", - // "action": { - // "type": "open_system_browser", - // "name": "button1", - // "value": "http://example.com/details/999" - // } + // "type": "button", + // "text": "자세히보기", + // "style": "primary", + // "action": { + // "type": "open_system_browser", + // "name": "button1", + // "value": "http://example.com/details/999" + // } // } } -func ExampleOpenInAppBrowserAction() { - buttonBlock := kakaowork.ButtonBlock{ - Text: "자세히보기", - Style: kakaowork.ButtonStylePrimary, - Action: kakaowork.OpenInAppBrowserAction{ - Name: "button1", - Value: "http://example.com/details/999", - }, - } - - jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") - if err != nil { - fmt.Println("Error:", err) - return - } - - fmt.Println(string(jsonBytes)) - // Output: { - // "type": "button", - // "text": "자세히보기", - // "style": "primary", - // "action": { - // "type": "open_inapp_browser", - // "name": "button1", - // "value": "http://example.com/details/999" - // } - // } -} - -func ExampleOpenInAppBrowserAction_Standalone() { +func ExampleOpenInAppBrowserAction_MarshalJSON() { buttonBlock := kakaowork.ButtonBlock{ Text: "새 창에서 보기", Style: kakaowork.ButtonStylePrimary, @@ -77,7 +48,7 @@ func ExampleOpenInAppBrowserAction_Standalone() { }, } - jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") + jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -85,21 +56,21 @@ func ExampleOpenInAppBrowserAction_Standalone() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "button", - // "text": "새 창에서 보기", - // "style": "primary", - // "action": { - // "type": "open_inapp_browser", - // "name": "button1", - // "value": "http://example.com/details/999", - // "standalone": true, - // "width": 980, - // "height": 720 - // } + // "type": "button", + // "text": "새 창에서 보기", + // "style": "primary", + // "action": { + // "type": "open_inapp_browser", + // "name": "button1", + // "value": "http://example.com/details/999", + // "standalone": true, + // "width": 980, + // "height": 720 + // } // } } -func ExampleOpenExternalAppAction() { +func ExampleOpenExternalAppAction_MarshalJSON() { buttonBlock := kakaowork.ButtonBlock{ Text: "카카오 지도에서 보기", Action: kakaowork.OpenExternalAppAction{ @@ -107,7 +78,7 @@ func ExampleOpenExternalAppAction() { }, } - jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") + jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -115,16 +86,16 @@ func ExampleOpenExternalAppAction() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "button", - // "text": "카카오 지도에서 보기", - // "action": { - // "type": "open_external_app", - // "value": "ios=kakaomap%3A%2F%2Flook%3Fp%3D37.537229%2C127.005515" - // } + // "type": "button", + // "text": "카카오 지도에서 보기", + // "action": { + // "type": "open_external_app", + // "value": "ios=kakaomap%3A%2F%2Flook%3Fp%3D37.537229%2C127.005515" + // } // } } -func ExampleSubmitAction() { +func ExampleSubmitAction_MarshalJSON() { buttonBlock := kakaowork.ButtonBlock{ Text: "일정 수락", Action: kakaowork.SubmitAction{ @@ -133,7 +104,7 @@ func ExampleSubmitAction() { }, } - jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") + jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -141,17 +112,17 @@ func ExampleSubmitAction() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "button", - // "text": "일정 수락", - // "action": { - // "type": "submit_action", - // "name": "accept", - // "value": "event_id=20210301-0024" - // } + // "type": "button", + // "text": "일정 수락", + // "action": { + // "type": "submit_action", + // "name": "accept", + // "value": "event_id=20210301-0024" + // } // } } -func ExampleCallModalAction() { +func ExampleCallModalAction_MarshalJSON() { buttonBlock := kakaowork.ButtonBlock{ Text: "결재창 띄우기", Action: kakaowork.CallModalAction{ @@ -159,7 +130,7 @@ func ExampleCallModalAction() { }, } - jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") + jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -167,16 +138,16 @@ func ExampleCallModalAction() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "button", - // "text": "결재창 띄우기", - // "action": { - // "type": "call_modal", - // "value": "number=20200401-PR-0024" - // } + // "type": "button", + // "text": "결재창 띄우기", + // "action": { + // "type": "call_modal", + // "value": "number=20200401-PR-0024" + // } // } } -func ExampleExclusiveAction() { +func ExampleExclusiveAction_MarshalJSON() { buttonBlock := kakaowork.ButtonBlock{ Text: "자세히보기", Style: kakaowork.ButtonStylePrimary, @@ -193,7 +164,7 @@ func ExampleExclusiveAction() { }, } - jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") + jsonBytes, err := json.MarshalIndent(buttonBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -201,23 +172,23 @@ func ExampleExclusiveAction() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "button", - // "text": "자세히보기", - // "style": "primary", - // "action": { - // "type": "exclusive", - // "default": { - // "type": "open_system_browser", - // "value": "https://example.com" - // }, - // "android": { - // "type": "open_external_app", - // "value": "geo:37.537229,127.005515" - // }, - // "ios": { - // "type": "open_inapp_browser", - // "value": "http://m.example.com" - // } + // "type": "button", + // "text": "자세히보기", + // "style": "primary", + // "action": { + // "type": "exclusive", + // "default": { + // "type": "open_system_browser", + // "value": "https://example.com" + // }, + // "android": { + // "type": "open_external_app", + // "value": "geo:37.537229,127.005515" + // }, + // "ios": { + // "type": "open_inapp_browser", + // "value": "http://m.example.com" // } + // } // } } diff --git a/kakaowork/ContextBlock_example_test.go b/kakaowork/ContextBlock_example_test.go index deb4665..ccd326e 100644 --- a/kakaowork/ContextBlock_example_test.go +++ b/kakaowork/ContextBlock_example_test.go @@ -6,7 +6,7 @@ import ( "github.com/JSYoo5B/convertago/kakaowork" ) -func ExampleContextBlock() { +func ExampleContextBlock_MarshalJSON() { contextBlock := kakaowork.ContextBlock{ Content: kakaowork.TextBlock{ Text: "카카오 판교 오피스", @@ -17,7 +17,7 @@ func ExampleContextBlock() { Image: kakaowork.ImageBlock{Url: "https://something.storage.host/upload/path/filename"}, } - jsonBytes, err := json.MarshalIndent(contextBlock, "", " ") + jsonBytes, err := json.MarshalIndent(contextBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -25,21 +25,21 @@ func ExampleContextBlock() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "context", - // "content": { - // "type": "text", + // "type": "context", + // "content": { + // "type": "text", + // "text": "카카오 판교 오피스", + // "inlines": [ + // { + // "type": "link", // "text": "카카오 판교 오피스", - // "inlines": [ - // { - // "type": "link", - // "text": "카카오 판교 오피스", - // "url": "http://kko.to/RRWQwZQj0" - // } - // ] - // }, - // "image": { - // "type": "image_link", - // "url": "https://something.storage.host/upload/path/filename" - // } + // "url": "http://kko.to/RRWQwZQj0" + // } + // ] + // }, + // "image": { + // "type": "image_link", + // "url": "https://something.storage.host/upload/path/filename" + // } // } } diff --git a/kakaowork/DescriptionBlock_example_test.go b/kakaowork/DescriptionBlock_example_test.go index d33d213..c8ae4e5 100644 --- a/kakaowork/DescriptionBlock_example_test.go +++ b/kakaowork/DescriptionBlock_example_test.go @@ -6,7 +6,7 @@ import ( "github.com/JSYoo5B/convertago/kakaowork" ) -func ExampleDescriptionBlock() { +func ExampleDescriptionBlock_MarshalJSON() { descriptionBlock := kakaowork.DescriptionBlock{ Term: "일시", Content: kakaowork.TextBlock{ @@ -18,7 +18,7 @@ func ExampleDescriptionBlock() { Accent: true, } - jsonBytes, err := json.MarshalIndent(descriptionBlock, "", " ") + jsonBytes, err := json.MarshalIndent(descriptionBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -26,19 +26,19 @@ func ExampleDescriptionBlock() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "description", - // "content": { - // "type": "text", + // "type": "description", + // "content": { + // "type": "text", + // "text": "2020년 2월 22일 오후 2시", + // "inlines": [ + // { + // "type": "styled", // "text": "2020년 2월 22일 오후 2시", - // "inlines": [ - // { - // "type": "styled", - // "text": "2020년 2월 22일 오후 2시", - // "bold": true - // } - // ] - // }, - // "term": "일시", - // "accent": true + // "bold": true + // } + // ] + // }, + // "term": "일시", + // "accent": true // } } diff --git a/kakaowork/DividerBlock_example_test.go b/kakaowork/DividerBlock_example_test.go index 56c0301..0ce21d5 100644 --- a/kakaowork/DividerBlock_example_test.go +++ b/kakaowork/DividerBlock_example_test.go @@ -6,10 +6,10 @@ import ( "github.com/JSYoo5B/convertago/kakaowork" ) -func ExampleDividerBlock() { +func ExampleDividerBlock_MarshalJSON() { dividerBlock := kakaowork.DividerBlock{} - jsonBytes, err := json.MarshalIndent(dividerBlock, "", " ") + jsonBytes, err := json.MarshalIndent(dividerBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -17,6 +17,6 @@ func ExampleDividerBlock() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "divider" + // "type": "divider" // } } diff --git a/kakaowork/HeaderBlock_example_test.go b/kakaowork/HeaderBlock_example_test.go index e33b840..2944a80 100644 --- a/kakaowork/HeaderBlock_example_test.go +++ b/kakaowork/HeaderBlock_example_test.go @@ -6,13 +6,13 @@ import ( "github.com/JSYoo5B/convertago/kakaowork" ) -func ExampleHeaderBlock() { +func ExampleHeaderBlock_MarshalJSON() { headerBlock := kakaowork.HeaderBlock{ Text: "내게 요청 온 결재", Style: kakaowork.HeaderStyleBlue, } - jsonBytes, err := json.MarshalIndent(headerBlock, "", " ") + jsonBytes, err := json.MarshalIndent(headerBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -20,8 +20,8 @@ func ExampleHeaderBlock() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "header", - // "text": "내게 요청 온 결재", - // "style": "blue" + // "type": "header", + // "text": "내게 요청 온 결재", + // "style": "blue" // } } diff --git a/kakaowork/ImageBlock_example_test.go b/kakaowork/ImageBlock_example_test.go index ddebd2c..058df86 100644 --- a/kakaowork/ImageBlock_example_test.go +++ b/kakaowork/ImageBlock_example_test.go @@ -6,10 +6,10 @@ import ( "github.com/JSYoo5B/convertago/kakaowork" ) -func ExampleImageBlock() { +func ExampleImageBlock_MarshalJSON() { textBlock := kakaowork.ImageBlock{Url: "https://something.storage.host/upload/path/filename"} - jsonBytes, err := json.MarshalIndent(textBlock, "", " ") + jsonBytes, err := json.MarshalIndent(textBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -17,7 +17,7 @@ func ExampleImageBlock() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "image_link", - // "url": "https://something.storage.host/upload/path/filename" + // "type": "image_link", + // "url": "https://something.storage.host/upload/path/filename" // } } diff --git a/kakaowork/SectionBlock_example_test.go b/kakaowork/SectionBlock_example_test.go index d663733..bfbbbf5 100644 --- a/kakaowork/SectionBlock_example_test.go +++ b/kakaowork/SectionBlock_example_test.go @@ -6,7 +6,7 @@ import ( "github.com/JSYoo5B/convertago/kakaowork" ) -func ExampleSectionBlock() { +func ExampleSectionBlock_MarshalJSON() { sectionBlock := kakaowork.SectionBlock{ Content: kakaowork.TextBlock{ Text: "블록킷\n구성\n정책", @@ -20,7 +20,7 @@ func ExampleSectionBlock() { Action: kakaowork.OpenSystemBrowserAction{Value: "http://example.com/details/999"}, } - jsonBytes, err := json.MarshalIndent(sectionBlock, "", " ") + jsonBytes, err := json.MarshalIndent(sectionBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -28,34 +28,34 @@ func ExampleSectionBlock() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "section", - // "content": { - // "type": "text", - // "text": "블록킷\n구성\n정책", - // "inlines": [ - // { - // "type": "styled", - // "text": "블록킷\n", - // "bold": true - // }, - // { - // "type": "styled", - // "text": "구성\n" - // }, - // { - // "type": "styled", - // "text": "정책", - // "italic": true - // } - // ] - // }, - // "accessory": { - // "type": "image_link", - // "url": "https://something.storage.host/upload/path/filename" - // }, - // "action": { - // "type": "open_system_browser", - // "value": "http://example.com/details/999" - // } + // "type": "section", + // "content": { + // "type": "text", + // "text": "블록킷\n구성\n정책", + // "inlines": [ + // { + // "type": "styled", + // "text": "블록킷\n", + // "bold": true + // }, + // { + // "type": "styled", + // "text": "구성\n" + // }, + // { + // "type": "styled", + // "text": "정책", + // "italic": true + // } + // ] + // }, + // "accessory": { + // "type": "image_link", + // "url": "https://something.storage.host/upload/path/filename" + // }, + // "action": { + // "type": "open_system_browser", + // "value": "http://example.com/details/999" + // } // } } diff --git a/kakaowork/TextBlock_example_test.go b/kakaowork/TextBlock_example_test.go index 0a38974..6d75815 100644 --- a/kakaowork/TextBlock_example_test.go +++ b/kakaowork/TextBlock_example_test.go @@ -6,7 +6,7 @@ import ( "github.com/JSYoo5B/convertago/kakaowork" ) -func ExampleTextBlock() { +func ExampleTextBlock_MarshalJSON() { textBlock := kakaowork.TextBlock{ Text: "카카오워크 텍스트 블록이 변경되었습니다. 자세한 설명은 기술 문서를 참고하시기 바랍니다. 담당자는 @ryan 입니다.", Inlines: []kakaowork.Inline{ @@ -20,7 +20,7 @@ func ExampleTextBlock() { }, } - jsonBytes, err := json.MarshalIndent(textBlock, "", " ") + jsonBytes, err := json.MarshalIndent(textBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -28,44 +28,44 @@ func ExampleTextBlock() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "text", - // "text": "카카오워크 텍스트 블록이 변경되었습니다. 자세한 설명은 기술 문서를 참고하시기 바랍니다. 담당자는 @ryan 입니다.", - // "inlines": [ - // { - // "type": "styled", - // "text": "카카오워크 " - // }, - // { - // "type": "styled", - // "text": "텍스트", - // "bold": true, - // "color": "red" - // }, - // { - // "type": "styled", - // "text": " 블록이 변경되었습니다. 자세한 설명은 " - // }, - // { - // "type": "link", - // "text": "기술 문서", - // "url": "https://blog.kakaowork.com/43" - // }, - // { - // "type": "styled", - // "text": "를 참고하시기 바랍니다. 담당자는" - // }, - // { - // "type": "mention", - // "text": "@ryan", - // "ref": { - // "type": "kw", - // "value": 0 - // } - // }, - // { - // "type": "styled", - // "text": " 입니다." - // } - // ] + // "type": "text", + // "text": "카카오워크 텍스트 블록이 변경되었습니다. 자세한 설명은 기술 문서를 참고하시기 바랍니다. 담당자는 @ryan 입니다.", + // "inlines": [ + // { + // "type": "styled", + // "text": "카카오워크 " + // }, + // { + // "type": "styled", + // "text": "텍스트", + // "bold": true, + // "color": "red" + // }, + // { + // "type": "styled", + // "text": " 블록이 변경되었습니다. 자세한 설명은 " + // }, + // { + // "type": "link", + // "text": "기술 문서", + // "url": "https://blog.kakaowork.com/43" + // }, + // { + // "type": "styled", + // "text": "를 참고하시기 바랍니다. 담당자는" + // }, + // { + // "type": "mention", + // "text": "@ryan", + // "ref": { + // "type": "kw", + // "value": 0 + // } + // }, + // { + // "type": "styled", + // "text": " 입니다." + // } + // ] // } } diff --git a/kakaowork/TextInline_example_test.go b/kakaowork/TextInline_example_test.go index 263a6a2..7750170 100644 --- a/kakaowork/TextInline_example_test.go +++ b/kakaowork/TextInline_example_test.go @@ -6,7 +6,7 @@ import ( "github.com/JSYoo5B/convertago/kakaowork" ) -func ExampleInlineStyled() { +func ExampleInlineStyled_MarshalJSON() { textBlock := kakaowork.TextBlock{ Text: "카카오워크 텍스트 블록 변경", Inlines: []kakaowork.Inline{ @@ -16,7 +16,7 @@ func ExampleInlineStyled() { }, } - jsonBytes, err := json.MarshalIndent(textBlock, "", " ") + jsonBytes, err := json.MarshalIndent(textBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -24,28 +24,28 @@ func ExampleInlineStyled() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "text", - // "text": "카카오워크 텍스트 블록 변경", - // "inlines": [ - // { - // "type": "styled", - // "text": "카카오워크 " - // }, - // { - // "type": "styled", - // "text": "텍스트", - // "bold": true - // }, - // { - // "type": "styled", - // "text": " 블록 변경", - // "color": "red" - // } - // ] + // "type": "text", + // "text": "카카오워크 텍스트 블록 변경", + // "inlines": [ + // { + // "type": "styled", + // "text": "카카오워크 " + // }, + // { + // "type": "styled", + // "text": "텍스트", + // "bold": true + // }, + // { + // "type": "styled", + // "text": " 블록 변경", + // "color": "red" + // } + // ] // } } -func ExampleInlineLink() { +func ExampleInlineLink_MarshalJSON() { textBlock := kakaowork.TextBlock{ Text: "카카오워크 기술문서", Inlines: []kakaowork.Inline{ @@ -53,7 +53,7 @@ func ExampleInlineLink() { }, } - jsonBytes, err := json.MarshalIndent(textBlock, "", " ") + jsonBytes, err := json.MarshalIndent(textBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -61,19 +61,19 @@ func ExampleInlineLink() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "text", - // "text": "카카오워크 기술문서", - // "inlines": [ - // { - // "type": "link", - // "text": "카카오워크 기술 문서", - // "url": "https://blog.kakaowork.com/43" - // } - // ] + // "type": "text", + // "text": "카카오워크 기술문서", + // "inlines": [ + // { + // "type": "link", + // "text": "카카오워크 기술 문서", + // "url": "https://blog.kakaowork.com/43" + // } + // ] // } } -func ExampleInlineMention() { +func ExampleInlineMention_MarshalJSON() { textBlock := kakaowork.TextBlock{ Text: "@ryan", Inlines: []kakaowork.Inline{ @@ -81,7 +81,7 @@ func ExampleInlineMention() { }, } - jsonBytes, err := json.MarshalIndent(textBlock, "", " ") + jsonBytes, err := json.MarshalIndent(textBlock, "", " ") if err != nil { fmt.Println("Error:", err) return @@ -89,17 +89,17 @@ func ExampleInlineMention() { fmt.Println(string(jsonBytes)) // Output: { - // "type": "text", - // "text": "@ryan", - // "inlines": [ - // { - // "type": "mention", - // "text": "@ryan", - // "ref": { - // "type": "kw", - // "value": 800 - // } - // } - // ] + // "type": "text", + // "text": "@ryan", + // "inlines": [ + // { + // "type": "mention", + // "text": "@ryan", + // "ref": { + // "type": "kw", + // "value": 800 + // } + // } + // ] // } } From 5e0ff3938cd6e1460e9c03a94df24b6db7369c27 Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Sun, 31 Dec 2023 14:02:57 +0900 Subject: [PATCH 04/14] build: update dependent version and optimize go.sum --- go.mod | 2 +- go.sum | 21 +++------------------ 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 2504828..d69cf5a 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.19.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect diff --git a/go.sum b/go.sum index 425a5d5..0f22694 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= @@ -24,25 +22,12 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= From 9b145ab994d65ec1687971dcf98bf0a8ab007162 Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Sun, 31 Dec 2023 14:59:10 +0900 Subject: [PATCH 05/14] build: rename files to golang file name convention --- kakaowork/{ButtonAction.go => button_action.go} | 0 ...ButtonAction_example_test.go => button_action_example_test.go} | 0 kakaowork/{ButtonBlock.go => button_block.go} | 0 kakaowork/{ButtonBlock_test.go => button_block_test.go} | 0 kakaowork/{ContextBlock.go => context_block.go} | 0 ...ContextBlock_example_test.go => context_block_example_test.go} | 0 kakaowork/{DescriptionBlock.go => description_block.go} | 0 ...ionBlock_example_test.go => description_block_example_test.go} | 0 kakaowork/{DividerBlock.go => divider_block.go} | 0 ...DividerBlock_example_test.go => divider_block_example_test.go} | 0 kakaowork/{HeaderBlock.go => header_block.go} | 0 .../{HeaderBlock_example_test.go => header_block_example_test.go} | 0 kakaowork/{ImageBlock.go => image_block.go} | 0 .../{ImageBlock_example_test.go => image_block_example_test.go} | 0 kakaowork/{ImageBlock_test.go => image_block_test.go} | 0 kakaowork/{Message.go => message.go} | 0 kakaowork/{SectionBlock.go => section_block.go} | 0 ...SectionBlock_example_test.go => section_block_example_test.go} | 0 kakaowork/{SectionBlock_test.go => section_block_test.go} | 0 kakaowork/{TextBlock.go => text_block.go} | 0 .../{TextBlock_example_test.go => text_block_example_test.go} | 0 kakaowork/{TextInline.go => text_inline.go} | 0 .../{TextInline_example_test.go => text_inline_example_test.go} | 0 23 files changed, 0 insertions(+), 0 deletions(-) rename kakaowork/{ButtonAction.go => button_action.go} (100%) rename kakaowork/{ButtonAction_example_test.go => button_action_example_test.go} (100%) rename kakaowork/{ButtonBlock.go => button_block.go} (100%) rename kakaowork/{ButtonBlock_test.go => button_block_test.go} (100%) rename kakaowork/{ContextBlock.go => context_block.go} (100%) rename kakaowork/{ContextBlock_example_test.go => context_block_example_test.go} (100%) rename kakaowork/{DescriptionBlock.go => description_block.go} (100%) rename kakaowork/{DescriptionBlock_example_test.go => description_block_example_test.go} (100%) rename kakaowork/{DividerBlock.go => divider_block.go} (100%) rename kakaowork/{DividerBlock_example_test.go => divider_block_example_test.go} (100%) rename kakaowork/{HeaderBlock.go => header_block.go} (100%) rename kakaowork/{HeaderBlock_example_test.go => header_block_example_test.go} (100%) rename kakaowork/{ImageBlock.go => image_block.go} (100%) rename kakaowork/{ImageBlock_example_test.go => image_block_example_test.go} (100%) rename kakaowork/{ImageBlock_test.go => image_block_test.go} (100%) rename kakaowork/{Message.go => message.go} (100%) rename kakaowork/{SectionBlock.go => section_block.go} (100%) rename kakaowork/{SectionBlock_example_test.go => section_block_example_test.go} (100%) rename kakaowork/{SectionBlock_test.go => section_block_test.go} (100%) rename kakaowork/{TextBlock.go => text_block.go} (100%) rename kakaowork/{TextBlock_example_test.go => text_block_example_test.go} (100%) rename kakaowork/{TextInline.go => text_inline.go} (100%) rename kakaowork/{TextInline_example_test.go => text_inline_example_test.go} (100%) diff --git a/kakaowork/ButtonAction.go b/kakaowork/button_action.go similarity index 100% rename from kakaowork/ButtonAction.go rename to kakaowork/button_action.go diff --git a/kakaowork/ButtonAction_example_test.go b/kakaowork/button_action_example_test.go similarity index 100% rename from kakaowork/ButtonAction_example_test.go rename to kakaowork/button_action_example_test.go diff --git a/kakaowork/ButtonBlock.go b/kakaowork/button_block.go similarity index 100% rename from kakaowork/ButtonBlock.go rename to kakaowork/button_block.go diff --git a/kakaowork/ButtonBlock_test.go b/kakaowork/button_block_test.go similarity index 100% rename from kakaowork/ButtonBlock_test.go rename to kakaowork/button_block_test.go diff --git a/kakaowork/ContextBlock.go b/kakaowork/context_block.go similarity index 100% rename from kakaowork/ContextBlock.go rename to kakaowork/context_block.go diff --git a/kakaowork/ContextBlock_example_test.go b/kakaowork/context_block_example_test.go similarity index 100% rename from kakaowork/ContextBlock_example_test.go rename to kakaowork/context_block_example_test.go diff --git a/kakaowork/DescriptionBlock.go b/kakaowork/description_block.go similarity index 100% rename from kakaowork/DescriptionBlock.go rename to kakaowork/description_block.go diff --git a/kakaowork/DescriptionBlock_example_test.go b/kakaowork/description_block_example_test.go similarity index 100% rename from kakaowork/DescriptionBlock_example_test.go rename to kakaowork/description_block_example_test.go diff --git a/kakaowork/DividerBlock.go b/kakaowork/divider_block.go similarity index 100% rename from kakaowork/DividerBlock.go rename to kakaowork/divider_block.go diff --git a/kakaowork/DividerBlock_example_test.go b/kakaowork/divider_block_example_test.go similarity index 100% rename from kakaowork/DividerBlock_example_test.go rename to kakaowork/divider_block_example_test.go diff --git a/kakaowork/HeaderBlock.go b/kakaowork/header_block.go similarity index 100% rename from kakaowork/HeaderBlock.go rename to kakaowork/header_block.go diff --git a/kakaowork/HeaderBlock_example_test.go b/kakaowork/header_block_example_test.go similarity index 100% rename from kakaowork/HeaderBlock_example_test.go rename to kakaowork/header_block_example_test.go diff --git a/kakaowork/ImageBlock.go b/kakaowork/image_block.go similarity index 100% rename from kakaowork/ImageBlock.go rename to kakaowork/image_block.go diff --git a/kakaowork/ImageBlock_example_test.go b/kakaowork/image_block_example_test.go similarity index 100% rename from kakaowork/ImageBlock_example_test.go rename to kakaowork/image_block_example_test.go diff --git a/kakaowork/ImageBlock_test.go b/kakaowork/image_block_test.go similarity index 100% rename from kakaowork/ImageBlock_test.go rename to kakaowork/image_block_test.go diff --git a/kakaowork/Message.go b/kakaowork/message.go similarity index 100% rename from kakaowork/Message.go rename to kakaowork/message.go diff --git a/kakaowork/SectionBlock.go b/kakaowork/section_block.go similarity index 100% rename from kakaowork/SectionBlock.go rename to kakaowork/section_block.go diff --git a/kakaowork/SectionBlock_example_test.go b/kakaowork/section_block_example_test.go similarity index 100% rename from kakaowork/SectionBlock_example_test.go rename to kakaowork/section_block_example_test.go diff --git a/kakaowork/SectionBlock_test.go b/kakaowork/section_block_test.go similarity index 100% rename from kakaowork/SectionBlock_test.go rename to kakaowork/section_block_test.go diff --git a/kakaowork/TextBlock.go b/kakaowork/text_block.go similarity index 100% rename from kakaowork/TextBlock.go rename to kakaowork/text_block.go diff --git a/kakaowork/TextBlock_example_test.go b/kakaowork/text_block_example_test.go similarity index 100% rename from kakaowork/TextBlock_example_test.go rename to kakaowork/text_block_example_test.go diff --git a/kakaowork/TextInline.go b/kakaowork/text_inline.go similarity index 100% rename from kakaowork/TextInline.go rename to kakaowork/text_inline.go diff --git a/kakaowork/TextInline_example_test.go b/kakaowork/text_inline_example_test.go similarity index 100% rename from kakaowork/TextInline_example_test.go rename to kakaowork/text_inline_example_test.go From 526b8de92e0bece7c6a7cffef2cd9666708cf972 Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Mon, 22 Jan 2024 23:06:42 +0900 Subject: [PATCH 06/14] docs: add documentation for TextBlock and relates --- kakaowork/text_block.go | 14 +++---- kakaowork/text_inline.go | 81 +++++++++++++++++----------------------- 2 files changed, 41 insertions(+), 54 deletions(-) diff --git a/kakaowork/text_block.go b/kakaowork/text_block.go index edce976..1e9aace 100644 --- a/kakaowork/text_block.go +++ b/kakaowork/text_block.go @@ -5,17 +5,18 @@ import ( "strings" ) +// TextBlock is a BubbleBlock to represent simple texts. +// When Text and Inlines differ, Inlines applied prior. // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/ - type TextBlock struct { - Text string `json:"text"` + // Text represents plain text without formatting + Text string `json:"text"` + // Inlines are partial blocks for text with formatting + // See also InlineStyled, InlineLink, InlineMention and Inline Inlines []Inline `json:"inlines,omitempty"` } -func (t TextBlock) Type() string { - return "text" -} - +func (t TextBlock) Type() string { return "text" } func (t TextBlock) String() string { if t.Inlines == nil { return t.Text @@ -27,7 +28,6 @@ func (t TextBlock) String() string { return strings.Join(inlineTexts, "") } } - func (t TextBlock) MarshalJSON() ([]byte, error) { type Embed TextBlock return json.Marshal(&struct { diff --git a/kakaowork/text_inline.go b/kakaowork/text_inline.go index ba4cadb..b1fe79f 100644 --- a/kakaowork/text_inline.go +++ b/kakaowork/text_inline.go @@ -2,21 +2,28 @@ package kakaowork import "encoding/json" +// Inline is type casting interface for TextBlock.Inlines. // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#inlines - type Inline interface { - BubbleBlock InlineType() string + BubbleBlock } +// InlineStyled gives styles to text. +// Style are represented by each field, and it can be applied at the same time. // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#styled - type InlineStyled struct { - Text string `json:"text"` - Bold bool `json:"bold,omitempty"` - Italic bool `json:"italic,omitempty"` - Strike bool `json:"strike,omitempty"` - Color InlineColor `json:"color,omitempty"` + // Text to apply styles + Text string `json:"text"` + // Bold style, disabled by default + Bold bool `json:"bold,omitempty"` + // Italic style, disabled by default + Italic bool `json:"italic,omitempty"` + // Strike style, disabled by default + Strike bool `json:"strike,omitempty"` + // Color supports InlineColorRed, InlineColorBlue, InlineColorGrey. + // InlineColorDefault of empty applies default plain text style + Color InlineColor `json:"color,omitempty"` } type InlineColor string @@ -37,14 +44,9 @@ var inlineColorConstants = map[InlineColor]bool{ InlineColorGrey: true, } -func (i InlineStyled) Type() string { - return "inline" -} - -func (i InlineStyled) String() string { - return i.Text -} - +func (i InlineStyled) InlineType() string { return "styled" } +func (i InlineStyled) Type() string { return "inline" } +func (i InlineStyled) String() string { return i.Text } func (i InlineStyled) MarshalJSON() ([]byte, error) { if _, exists := inlineColorConstants[i.Color]; !exists { i.Color = InlineColorDefault @@ -60,24 +62,20 @@ func (i InlineStyled) MarshalJSON() ([]byte, error) { }) } -func (i InlineStyled) InlineType() string { - return "styled" -} - +// InlineLink links text to scheme (http/https, mailto, tel). // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#link - type InlineLink struct { + // Text to apply link Text string `json:"text"` - Url string `json:"url"` -} - -func (i InlineLink) Type() string { - return "inline" -} -func (i InlineLink) String() string { - return i.Text + // Url starts with "http:", "https:" will link to web browser. + // Url starts with "tel:" will link to call. + // Url starts with "mailto:" will link to mail client. + Url string `json:"url"` } +func (i InlineLink) InlineType() string { return "link" } +func (i InlineLink) Type() string { return "inline" } +func (i InlineLink) String() string { return i.Text } func (i InlineLink) MarshalJSON() ([]byte, error) { type Embed InlineLink return json.Marshal(&struct { @@ -89,25 +87,18 @@ func (i InlineLink) MarshalJSON() ([]byte, error) { }) } -func (i InlineLink) InlineType() string { - return "link" -} - +// InlineMention can mention the other user. // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#mention - type InlineMention struct { - Text string + // Text to apply mention + Text string + // UserId to mention UserId int } -func (i InlineMention) Type() string { - return "inline" -} - -func (i InlineMention) String() string { - return i.Text -} - +func (i InlineMention) InlineType() string { return "mention" } +func (i InlineMention) Type() string { return "inline" } +func (i InlineMention) String() string { return i.Text } func (i InlineMention) MarshalJSON() ([]byte, error) { type Ref struct { Type string `json:"type"` @@ -127,7 +118,3 @@ func (i InlineMention) MarshalJSON() ([]byte, error) { }, }) } - -func (i InlineMention) InlineType() string { - return "mention" -} From 327a6fd45e2b5ae676893f5638789c1a5c33d62c Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Tue, 27 Feb 2024 18:15:21 +0900 Subject: [PATCH 07/14] refactor: remove empty indicating constants --- kakaowork/text_inline.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/kakaowork/text_inline.go b/kakaowork/text_inline.go index b1fe79f..d4d6901 100644 --- a/kakaowork/text_inline.go +++ b/kakaowork/text_inline.go @@ -29,21 +29,12 @@ type InlineStyled struct { type InlineColor string const ( - InlineColorEmpty = InlineColor("") InlineColorDefault = InlineColor("default") InlineColorRed = InlineColor("red") InlineColorBlue = InlineColor("blue") InlineColorGrey = InlineColor("grey") ) -var inlineColorConstants = map[InlineColor]bool{ - InlineColorEmpty: true, - InlineColorDefault: true, - InlineColorRed: true, - InlineColorBlue: true, - InlineColorGrey: true, -} - func (i InlineStyled) InlineType() string { return "styled" } func (i InlineStyled) Type() string { return "inline" } func (i InlineStyled) String() string { return i.Text } @@ -62,6 +53,14 @@ func (i InlineStyled) MarshalJSON() ([]byte, error) { }) } +var inlineColorConstants = map[InlineColor]bool{ + InlineColor(""): true, // Empty allowed. (will be applied as default) + InlineColorDefault: true, + InlineColorRed: true, + InlineColorBlue: true, + InlineColorGrey: true, +} + // InlineLink links text to scheme (http/https, mailto, tel). // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#link type InlineLink struct { From c32c1209973aea018eab1d8849045178c2df67b7 Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Tue, 27 Feb 2024 18:16:13 +0900 Subject: [PATCH 08/14] docs: add documentation for some blocks --- kakaowork/context_block.go | 12 +++--------- kakaowork/divider_block.go | 12 +++--------- kakaowork/image_block.go | 12 +++--------- 3 files changed, 9 insertions(+), 27 deletions(-) diff --git a/kakaowork/context_block.go b/kakaowork/context_block.go index 6cfe66f..c14ac76 100644 --- a/kakaowork/context_block.go +++ b/kakaowork/context_block.go @@ -2,21 +2,15 @@ package kakaowork import "encoding/json" +// ContextBlock is a combined block which can represent image and text // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/contextblock/ - type ContextBlock struct { Content TextBlock `json:"content"` Image ImageBlock `json:"image"` } -func (c ContextBlock) Type() string { - return "context" -} - -func (c ContextBlock) String() string { - return c.Content.String() -} - +func (c ContextBlock) Type() string { return "context" } +func (c ContextBlock) String() string { return c.Content.String() } func (c ContextBlock) MarshalJSON() ([]byte, error) { type Embed ContextBlock return json.Marshal(&struct { diff --git a/kakaowork/divider_block.go b/kakaowork/divider_block.go index 37b3d5c..6b99447 100644 --- a/kakaowork/divider_block.go +++ b/kakaowork/divider_block.go @@ -2,18 +2,12 @@ package kakaowork import "encoding/json" +// DividerBlock is a divider in a message. // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/dividerblock/ - type DividerBlock struct{} -func (d DividerBlock) Type() string { - return "divider" -} - -func (d DividerBlock) String() string { - return "---" -} - +func (d DividerBlock) Type() string { return "divider" } +func (d DividerBlock) String() string { return "---" } func (d DividerBlock) MarshalJSON() ([]byte, error) { return json.Marshal(&struct { Type string `json:"type"` diff --git a/kakaowork/image_block.go b/kakaowork/image_block.go index 688d9ac..a50c22b 100644 --- a/kakaowork/image_block.go +++ b/kakaowork/image_block.go @@ -2,20 +2,14 @@ package kakaowork import "encoding/json" +// ImageBlock draws image with given Url // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/imagelinkblock/ - type ImageBlock struct { Url string `json:"url" validate:"required,url"` } -func (i ImageBlock) Type() string { - return "image_link" -} - -func (i ImageBlock) String() string { - return `{"image": "` + i.Url + `"}` -} - +func (i ImageBlock) Type() string { return "image_link" } +func (i ImageBlock) String() string { return `{"image": "` + i.Url + `"}` } func (i ImageBlock) MarshalJSON() ([]byte, error) { type Embed ImageBlock return json.Marshal(&struct { From 0b6d1380933a84bda32539b6fa5d052e50f62ee6 Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Thu, 11 Apr 2024 21:47:12 +0900 Subject: [PATCH 09/14] docs: change documentation with Korean reference --- kakaowork/divider_block.go | 4 +++- kakaowork/header_block.go | 39 +++++++++++++++++---------------- kakaowork/image_block.go | 4 +++- kakaowork/text_block.go | 14 +++++++----- kakaowork/text_inline.go | 45 ++++++++++++++++++++++++-------------- 5 files changed, 63 insertions(+), 43 deletions(-) diff --git a/kakaowork/divider_block.go b/kakaowork/divider_block.go index 6b99447..1044672 100644 --- a/kakaowork/divider_block.go +++ b/kakaowork/divider_block.go @@ -2,7 +2,9 @@ package kakaowork import "encoding/json" -// DividerBlock is a divider in a message. +// DividerBlock 은 말풍선 안에서 구분 선을 표현하는 블록입니다. +// BubbleBlock 과 BubbleBlock 사이에 자유롭게 위치할 수 있으며, Message.Blocks 최상단과 최하단에 배치하는 것은 지양합니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/dividerblock/ type DividerBlock struct{} diff --git a/kakaowork/header_block.go b/kakaowork/header_block.go index b01d5ca..8b2a48f 100644 --- a/kakaowork/header_block.go +++ b/kakaowork/header_block.go @@ -2,39 +2,32 @@ package kakaowork import "encoding/json" +// HeaderBlock 은 말풍선의 최상단에만 지정할 수 있는 블록으로, 말풍선의 헤더를 색상으로 구분하여 표시할 수 있습니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/headerblock/ - type HeaderBlock struct { - Text string `json:"text"` + // Text 에 내용을 입력합니다. + // - 최대 20자까지 입력 가능 + // - 말풍선 사이즈에 따라 말줄임 처리 + // - 기본 Bold 로 처리 + // - 줄바꿈은 미지원 + Text string `json:"text"` + // Style 에 색상 설정, 기본 값은 하얀 색 + // 설정 가능한 값: HeaderStyleWhite, HeaderStyleBlue, HeaderStyleRed, HeaderStyleYellow Style HeaderStyle `json:"style"` } type HeaderStyle string const ( - HeaderStyleEmpty = HeaderStyle("") HeaderStyleWhite = HeaderStyle("white") HeaderStyleBlue = HeaderStyle("blue") HeaderStyleRed = HeaderStyle("red") HeaderStyleYellow = HeaderStyle("yellow") ) -var headerStyleConstants = map[HeaderStyle]bool{ - HeaderStyleEmpty: true, - HeaderStyleWhite: true, - HeaderStyleBlue: true, - HeaderStyleRed: true, - HeaderStyleYellow: true, -} - -func (h HeaderBlock) Type() string { - return "header" -} - -func (h HeaderBlock) String() string { - return h.Text -} - +func (h HeaderBlock) Type() string { return "header" } +func (h HeaderBlock) String() string { return h.Text } func (h HeaderBlock) MarshalJSON() ([]byte, error) { if _, exists := headerStyleConstants[h.Style]; !exists { h.Style = HeaderStyleWhite @@ -49,3 +42,11 @@ func (h HeaderBlock) MarshalJSON() ([]byte, error) { Embed: (Embed)(h), }) } + +var headerStyleConstants = map[HeaderStyle]bool{ + HeaderStyle(""): true, + HeaderStyleWhite: true, + HeaderStyleBlue: true, + HeaderStyleRed: true, + HeaderStyleYellow: true, +} diff --git a/kakaowork/image_block.go b/kakaowork/image_block.go index a50c22b..875a958 100644 --- a/kakaowork/image_block.go +++ b/kakaowork/image_block.go @@ -2,9 +2,11 @@ package kakaowork import "encoding/json" -// ImageBlock draws image with given Url +// ImageBlock 은 말풍선 안에서 이미지를 표현하는 블록으로, 레이아웃 블록을 구성하는 엘리먼트의 속성으로 사용되기도 합니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/imagelinkblock/ type ImageBlock struct { + // Url 에 출력할 이미지의 URL 을 입력합니다. Url string `json:"url" validate:"required,url"` } diff --git a/kakaowork/text_block.go b/kakaowork/text_block.go index 1e9aace..e471f44 100644 --- a/kakaowork/text_block.go +++ b/kakaowork/text_block.go @@ -5,14 +5,18 @@ import ( "strings" ) -// TextBlock is a BubbleBlock to represent simple texts. -// When Text and Inlines differ, Inlines applied prior. +// TextBlock 은 말풍선에서 가장 기본인 텍스트를 표현하는 블록입니다. +// 단독으로도 존재할 수 있지만, 레이아웃 블록을 구성하는 엘리먼트의 속성으로 사용되기도 합니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/ type TextBlock struct { - // Text represents plain text without formatting + // Text 에 표현할 텍스트를 입력합니다. + // - 전체 텍스트를 \n을 포함하여 기술 + // - Inlines 서식을 적용할 텍스트까지 포함하여 작성 필요 + // - Inlines 와 정합성이 맞지 않을 경우, Inlines 의 String()를 우선으로 적용함 Text string `json:"text"` - // Inlines are partial blocks for text with formatting - // See also InlineStyled, InlineLink, InlineMention and Inline + // Inlines 에 다양한 추가 서식을 적용하여 텍스트 및 스타일 설정 가능 + // 적용 가능한 서식은 InlineStyled, InlineLink, InlineMention 참고 Inlines []Inline `json:"inlines,omitempty"` } diff --git a/kakaowork/text_inline.go b/kakaowork/text_inline.go index d4d6901..1115d5b 100644 --- a/kakaowork/text_inline.go +++ b/kakaowork/text_inline.go @@ -2,27 +2,33 @@ package kakaowork import "encoding/json" -// Inline is type casting interface for TextBlock.Inlines. +// Inline 은 텍스트에 다양한 추가 서식을 적용할 때 사용하는 TextBlock 포맷입니다. +// 포맷은 InlineStyled, InlineLink, InlineMention 속성으로 구성됩니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#inlines +// +// TextBlock.Inlines 내 캐스팅을 위해 제공되는 interface 입니다. type Inline interface { InlineType() string BubbleBlock } -// InlineStyled gives styles to text. -// Style are represented by each field, and it can be applied at the same time. +// InlineStyled 는 TextBlock 에 Bold, Italic, Strike, Color 스타일을 지정하여 텍스트를 꾸미는 속성입니다. +// 속성은 굵은 글씨체, 기울어진 글씨체, 취소선, 글자 색상의 스타일을 중복하여 지정할 수 있습니다. +// 값을 명시하지 않은 경우에는 속성별 기본값이 적용됩니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#styled type InlineStyled struct { - // Text to apply styles + // Text 에 스타일을 적용할 텍스트를 입력합니다. Text string `json:"text"` - // Bold style, disabled by default + // Bold 는 굵은 글씨체를 적용하며, 기본값은 false 입니다. Bold bool `json:"bold,omitempty"` - // Italic style, disabled by default + // Italic 은 기울어진 글씨체를 적용하며, 기본값은 false 입니다. Italic bool `json:"italic,omitempty"` - // Strike style, disabled by default + // Strike 는 취소선을 적용하며, 기본값은 false 입니다. Strike bool `json:"strike,omitempty"` - // Color supports InlineColorRed, InlineColorBlue, InlineColorGrey. - // InlineColorDefault of empty applies default plain text style + // Color 는 글자 색상을 적용하며, 기본값은 검은색입니다. + // InlineColorRed, InlineColorBlue, InlineColorGrey 로 설정할 수 있습니다. Color InlineColor `json:"color,omitempty"` } @@ -61,14 +67,17 @@ var inlineColorConstants = map[InlineColor]bool{ InlineColorGrey: true, } -// InlineLink links text to scheme (http/https, mailto, tel). +// InlineLink 는 TextBlock 에 다음과 같은 HTTP 또는 HTTPS 스킴을 적용할 수 있는 속성입니다. +// 메일 주소(mailto:)와 연락처(tel:)가 입력될 경우, 각 클라이언트 특성에 맞게 링크가 자동으로 연결합니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#link type InlineLink struct { - // Text to apply link + // Text 에 링크를 적용할 텍스트를 입력합니다. Text string `json:"text"` - // Url starts with "http:", "https:" will link to web browser. - // Url starts with "tel:" will link to call. - // Url starts with "mailto:" will link to mail client. + // Url 에 연결할 링크 주소를 입력합니다. + // "http:", "https:" 로 시작한다면 브라우저로 연결합니다. + // "tel:" 로 시작한다면 통화 또는 브라우저로 연결합니다. + // "mailto:" 로 시작한다면 메일 작성으로 연결합니다. Url string `json:"url"` } @@ -86,12 +95,14 @@ func (i InlineLink) MarshalJSON() ([]byte, error) { }) } -// InlineMention can mention the other user. +// InlineMention 은 TextBlock 에서 사용자를 멘션할 수 있는 속성이며, 채팅방에 멘션된 참여자가 존재할 경우에만 동작합니다. +// 멘션된 사용자를 클릭하면, 해당 사용자의 프로필 카드가 표시됩니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#mention type InlineMention struct { - // Text to apply mention + // Text 에 멘션을 적용할 텍스트를 입력합니다. Text string - // UserId to mention + // UserId 에 멘션할 멤버의 고유 정보를 입력합니다. UserId int } From 16e7078dd5252cfde22245853521875bfb97b680 Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Fri, 3 May 2024 23:57:28 +0900 Subject: [PATCH 10/14] docs: add documentation for Description, Divider and Section Blocks --- kakaowork/description_block.go | 20 +++++++++----------- kakaowork/divider_block.go | 2 +- kakaowork/section_block.go | 23 +++++++++++------------ 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/kakaowork/description_block.go b/kakaowork/description_block.go index c256015..e0595a3 100644 --- a/kakaowork/description_block.go +++ b/kakaowork/description_block.go @@ -2,22 +2,20 @@ package kakaowork import "encoding/json" +// DescriptionBlock 은 말풍선 안에서 짧은 단어와 그에 대한 상세 정보를 설명할 때 사용합니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/descriptionblock/ - type DescriptionBlock struct { + // Content 에 상세 내용을 TextBlock 으로 입력합니다. Content TextBlock `json:"content"` - Term string `json:"term"` - Accent bool `json:"accent,omitempty"` -} - -func (d DescriptionBlock) Type() string { - return "description" -} - -func (d DescriptionBlock) String() string { - return d.Term + ": " + d.Content.String() + // Term 에 Content 의 내용을 요약하는 문구로 입력합니다. + Term string `json:"term"` + // Accent 는 Term 의 내용을 굵은 글씨체로 적용하며, 기본값은 false 입니다. + Accent bool `json:"accent,omitempty"` } +func (d DescriptionBlock) Type() string { return "description" } +func (d DescriptionBlock) String() string { return d.Term + ": " + d.Content.String() } func (d DescriptionBlock) MarshalJSON() ([]byte, error) { type Embed DescriptionBlock return json.Marshal(&struct { diff --git a/kakaowork/divider_block.go b/kakaowork/divider_block.go index 1044672..aa6cddf 100644 --- a/kakaowork/divider_block.go +++ b/kakaowork/divider_block.go @@ -3,7 +3,7 @@ package kakaowork import "encoding/json" // DividerBlock 은 말풍선 안에서 구분 선을 표현하는 블록입니다. -// BubbleBlock 과 BubbleBlock 사이에 자유롭게 위치할 수 있으며, Message.Blocks 최상단과 최하단에 배치하는 것은 지양합니다. +// BubbleBlock 들 사이에 자유롭게 위치할 수 있으며, Message.Blocks 최상단과 최하단에 배치하는 것은 지양합니다. // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/dividerblock/ type DividerBlock struct{} diff --git a/kakaowork/section_block.go b/kakaowork/section_block.go index 515245e..5851bfb 100644 --- a/kakaowork/section_block.go +++ b/kakaowork/section_block.go @@ -2,22 +2,21 @@ package kakaowork import "encoding/json" +// SectionBlock 은 TextBlock(좌측)과 ImageBlock(우측)이 조합된 레이아웃 블록으로, +// 말풍선 안에서 텍스트와 함께 추가 정보를 이미지로 표현하고자 할 때 사용됩니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/sectionblock/ - type SectionBlock struct { - Content TextBlock `json:"content"` - Accessory *ImageBlock `json:"accessory,omitempty"` - Action ButtonAction `json:"action,omitempty"` -} - -func (s SectionBlock) Type() string { - return "section" -} - -func (s SectionBlock) String() string { - return s.Content.String() + // Content 에 텍스트를 표현하는 속성 블럭을 입력합니다. + Content TextBlock `json:"content"` + // Accesory 에 이미지를 표현하는 속성 블럭을 입력합니다. (선택) + Accessory *ImageBlock `json:"accessory,omitempty"` + // ButtonAction 에 클릭 시 수행될 동작을 입력합니다. (선택) + Action ButtonAction `json:"action,omitempty"` } +func (s SectionBlock) Type() string { return "section" } +func (s SectionBlock) String() string { return s.Content.String() } func (s SectionBlock) MarshalJSON() ([]byte, error) { type Embed SectionBlock return json.Marshal(&struct { From 88f6f657c4c2ba403e2293b14e46594a4ef26d6c Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Wed, 26 Jun 2024 07:01:28 +0900 Subject: [PATCH 11/14] build: Update dependencies --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 3bc1118..e615353 100644 --- a/go.mod +++ b/go.mod @@ -3,20 +3,20 @@ module github.com/JSYoo5B/convertago go 1.20 require ( - github.com/go-playground/validator/v10 v10.19.0 + github.com/go-playground/validator/v10 v10.22.0 github.com/stretchr/testify v1.9.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gabriel-vasile/mimetype v1.4.4 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/crypto v0.24.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 75de1fc..b38a116 100644 --- a/go.sum +++ b/go.sum @@ -1,28 +1,28 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= +github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= -github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= +github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From fd24ac7df6af45edb439e105a6053a2d98e07e38 Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Thu, 4 Jul 2024 01:52:04 +0900 Subject: [PATCH 12/14] docs: Add comment about ButtonBlock --- kakaowork/button_block.go | 48 +++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/kakaowork/button_block.go b/kakaowork/button_block.go index 2170ec4..1848d0c 100644 --- a/kakaowork/button_block.go +++ b/kakaowork/button_block.go @@ -4,41 +4,38 @@ import ( "encoding/json" ) +// ButtonBlock 은 말풍선에서 버튼을 표현하는 블록으로, 레이아웃 블록을 구성하는 엘리먼트의 속성으로 사용되기도 합니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/buttonblock/ - type ButtonBlock struct { - Text string `json:"text"` - Style ButtonStyle `json:"style,omitempty"` + // Text 에 버튼이 표현할 텍스트를 입력 + Text string `json:"text"` + // Style 은 버튼의 색상을 표현하며, 기본은 회색으로 설정됨 + // - 기본, 회색: ButtonStyleDefault 혹은 ButtonStyleGray + // - 강조, 파랑: ButtonStylePrimary 혹은 ButtonStyleBlue + // - 위험, 빨강: ButtonStyleDanger 혹은 ButtonStyleRed + Style ButtonStyle `json:"style,omitempty"` + // Action 에 버튼을 클릭했을 때 수행할 동작을 설정 + // 적용 가능한 동작은 OpenSystemBrowserAction, OpenInAppBrowserAction, OpenExternalAppAction, SubmitAction, CallModalAction, ExclusiveAction 참고 Action ButtonAction `json:"action"` } type ButtonStyle string const ( - ButtonStyleEmpty = ButtonStyle("") ButtonStyleDefault = ButtonStyle("default") - ButtonStyleGray = ButtonStyleDefault ButtonStylePrimary = ButtonStyle("primary") - ButtonStyleBlue = ButtonStylePrimary ButtonStyleDanger = ButtonStyle("danger") - ButtonStyleRed = ButtonStyleDanger + // ButtonStyleGray 는 ButtonStyleDefault 와 동일. + ButtonStyleGray = ButtonStyleDefault + // ButtonStyleBlue 는 ButtonStylePrimary 와 동일 + ButtonStyleBlue = ButtonStylePrimary + // ButtonStyleRed 는 ButtonStyleDanger 와 동일 + ButtonStyleRed = ButtonStyleDanger ) -var buttonStyleConstants = map[ButtonStyle]bool{ - ButtonStyleEmpty: true, - ButtonStyleGray: true, - ButtonStyleBlue: true, - ButtonStyleRed: true, -} - -func (b ButtonBlock) Type() string { - return "button" -} - -func (b ButtonBlock) String() string { - return b.Text + ": " + b.Action.String() -} - +func (b ButtonBlock) Type() string { return "button" } +func (b ButtonBlock) String() string { return b.Text + ": " + b.Action.String() } func (b ButtonBlock) MarshalJSON() ([]byte, error) { if _, exists := buttonStyleConstants[b.Style]; !exists { b.Style = ButtonStyleDefault @@ -53,3 +50,10 @@ func (b ButtonBlock) MarshalJSON() ([]byte, error) { Embed: (Embed)(b), }) } + +var buttonStyleConstants = map[ButtonStyle]bool{ + ButtonStyle(""): true, + ButtonStyleGray: true, + ButtonStyleBlue: true, + ButtonStyleRed: true, +} From f594f8e6cc388c0735c1aae1461cabd8705d12b9 Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Thu, 4 Jul 2024 01:57:05 +0900 Subject: [PATCH 13/14] docs: Match tone and manners in comments --- kakaowork/button_block.go | 4 ++-- kakaowork/description_block.go | 6 +++--- kakaowork/divider_block.go | 1 - kakaowork/header_block.go | 4 ++-- kakaowork/image_block.go | 2 +- kakaowork/section_block.go | 6 +++--- kakaowork/text_block.go | 2 +- kakaowork/text_inline.go | 26 +++++++++++++------------- 8 files changed, 25 insertions(+), 26 deletions(-) diff --git a/kakaowork/button_block.go b/kakaowork/button_block.go index 1848d0c..ac1e14d 100644 --- a/kakaowork/button_block.go +++ b/kakaowork/button_block.go @@ -10,13 +10,13 @@ import ( type ButtonBlock struct { // Text 에 버튼이 표현할 텍스트를 입력 Text string `json:"text"` - // Style 은 버튼의 색상을 표현하며, 기본은 회색으로 설정됨 + // Style 은 버튼의 색상을 표현하며, 기본값은 회색 // - 기본, 회색: ButtonStyleDefault 혹은 ButtonStyleGray // - 강조, 파랑: ButtonStylePrimary 혹은 ButtonStyleBlue // - 위험, 빨강: ButtonStyleDanger 혹은 ButtonStyleRed Style ButtonStyle `json:"style,omitempty"` // Action 에 버튼을 클릭했을 때 수행할 동작을 설정 - // 적용 가능한 동작은 OpenSystemBrowserAction, OpenInAppBrowserAction, OpenExternalAppAction, SubmitAction, CallModalAction, ExclusiveAction 참고 + // 설정 가능한 값: OpenSystemBrowserAction, OpenInAppBrowserAction, OpenExternalAppAction, SubmitAction, CallModalAction, ExclusiveAction 참고 Action ButtonAction `json:"action"` } diff --git a/kakaowork/description_block.go b/kakaowork/description_block.go index e0595a3..3af67bc 100644 --- a/kakaowork/description_block.go +++ b/kakaowork/description_block.go @@ -6,11 +6,11 @@ import "encoding/json" // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/descriptionblock/ type DescriptionBlock struct { - // Content 에 상세 내용을 TextBlock 으로 입력합니다. + // Content 에 상세 내용을 TextBlock 으로 입력 Content TextBlock `json:"content"` - // Term 에 Content 의 내용을 요약하는 문구로 입력합니다. + // Term 에 Content 의 내용을 요약하는 문구로 입력 Term string `json:"term"` - // Accent 는 Term 의 내용을 굵은 글씨체로 적용하며, 기본값은 false 입니다. + // Accent 는 Term 의 내용을 굵은 글씨체로 적용하며, 기본값은 false Accent bool `json:"accent,omitempty"` } diff --git a/kakaowork/divider_block.go b/kakaowork/divider_block.go index aa6cddf..135cdc4 100644 --- a/kakaowork/divider_block.go +++ b/kakaowork/divider_block.go @@ -3,7 +3,6 @@ package kakaowork import "encoding/json" // DividerBlock 은 말풍선 안에서 구분 선을 표현하는 블록입니다. -// BubbleBlock 들 사이에 자유롭게 위치할 수 있으며, Message.Blocks 최상단과 최하단에 배치하는 것은 지양합니다. // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/dividerblock/ type DividerBlock struct{} diff --git a/kakaowork/header_block.go b/kakaowork/header_block.go index 8b2a48f..f291b68 100644 --- a/kakaowork/header_block.go +++ b/kakaowork/header_block.go @@ -6,13 +6,13 @@ import "encoding/json" // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/headerblock/ type HeaderBlock struct { - // Text 에 내용을 입력합니다. + // Text 에 내용을 입력 // - 최대 20자까지 입력 가능 // - 말풍선 사이즈에 따라 말줄임 처리 // - 기본 Bold 로 처리 // - 줄바꿈은 미지원 Text string `json:"text"` - // Style 에 색상 설정, 기본 값은 하얀 색 + // Style 에 색상 설정, 기본값은 흰색 // 설정 가능한 값: HeaderStyleWhite, HeaderStyleBlue, HeaderStyleRed, HeaderStyleYellow Style HeaderStyle `json:"style"` } diff --git a/kakaowork/image_block.go b/kakaowork/image_block.go index 875a958..164edd2 100644 --- a/kakaowork/image_block.go +++ b/kakaowork/image_block.go @@ -6,7 +6,7 @@ import "encoding/json" // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/imagelinkblock/ type ImageBlock struct { - // Url 에 출력할 이미지의 URL 을 입력합니다. + // Url 에 출력할 이미지의 URL 을 입력 Url string `json:"url" validate:"required,url"` } diff --git a/kakaowork/section_block.go b/kakaowork/section_block.go index 5851bfb..a0c2b32 100644 --- a/kakaowork/section_block.go +++ b/kakaowork/section_block.go @@ -7,11 +7,11 @@ import "encoding/json" // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/sectionblock/ type SectionBlock struct { - // Content 에 텍스트를 표현하는 속성 블럭을 입력합니다. + // Content 에 텍스트를 표현하는 속성 블럭을 입력 Content TextBlock `json:"content"` - // Accesory 에 이미지를 표현하는 속성 블럭을 입력합니다. (선택) + // Accessory 에 이미지를 표현하는 속성 블럭을 입력 (선택) Accessory *ImageBlock `json:"accessory,omitempty"` - // ButtonAction 에 클릭 시 수행될 동작을 입력합니다. (선택) + // ButtonAction 에 클릭 시 수행될 동작을 입력합 (선택) Action ButtonAction `json:"action,omitempty"` } diff --git a/kakaowork/text_block.go b/kakaowork/text_block.go index e471f44..904f53a 100644 --- a/kakaowork/text_block.go +++ b/kakaowork/text_block.go @@ -10,7 +10,7 @@ import ( // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/ type TextBlock struct { - // Text 에 표현할 텍스트를 입력합니다. + // Text 에 표현할 텍스트를 입력 // - 전체 텍스트를 \n을 포함하여 기술 // - Inlines 서식을 적용할 텍스트까지 포함하여 작성 필요 // - Inlines 와 정합성이 맞지 않을 경우, Inlines 의 String()를 우선으로 적용함 diff --git a/kakaowork/text_inline.go b/kakaowork/text_inline.go index 1115d5b..155c1d5 100644 --- a/kakaowork/text_inline.go +++ b/kakaowork/text_inline.go @@ -19,16 +19,16 @@ type Inline interface { // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#styled type InlineStyled struct { - // Text 에 스타일을 적용할 텍스트를 입력합니다. + // Text 에 스타일을 적용할 텍스트를 입력 Text string `json:"text"` - // Bold 는 굵은 글씨체를 적용하며, 기본값은 false 입니다. + // Bold 는 굵은 글씨체를 적용하며, 기본값은 false Bold bool `json:"bold,omitempty"` - // Italic 은 기울어진 글씨체를 적용하며, 기본값은 false 입니다. + // Italic 은 기울어진 글씨체를 적용하며, 기본값은 false Italic bool `json:"italic,omitempty"` - // Strike 는 취소선을 적용하며, 기본값은 false 입니다. + // Strike 는 취소선을 적용하며, 기본값은 false Strike bool `json:"strike,omitempty"` - // Color 는 글자 색상을 적용하며, 기본값은 검은색입니다. - // InlineColorRed, InlineColorBlue, InlineColorGrey 로 설정할 수 있습니다. + // Color 는 글자 색상을 적용하며, 기본값은 검은색 + // 설정 가능한 값: InlineColorRed, InlineColorBlue, InlineColorGrey Color InlineColor `json:"color,omitempty"` } @@ -72,12 +72,12 @@ var inlineColorConstants = map[InlineColor]bool{ // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#link type InlineLink struct { - // Text 에 링크를 적용할 텍스트를 입력합니다. + // Text 에 링크를 적용할 텍스트를 입력 Text string `json:"text"` - // Url 에 연결할 링크 주소를 입력합니다. - // "http:", "https:" 로 시작한다면 브라우저로 연결합니다. - // "tel:" 로 시작한다면 통화 또는 브라우저로 연결합니다. - // "mailto:" 로 시작한다면 메일 작성으로 연결합니다. + // Url 에 연결할 링크 주소를 입력 + // "http:", "https:" 로 시작한다면 브라우저로 연결 + // "tel:" 로 시작한다면 통화 또는 브라우저로 연결 + // "mailto:" 로 시작한다면 메일 작성으로 연결 Url string `json:"url"` } @@ -100,9 +100,9 @@ func (i InlineLink) MarshalJSON() ([]byte, error) { // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/#mention type InlineMention struct { - // Text 에 멘션을 적용할 텍스트를 입력합니다. + // Text 에 멘션을 적용할 텍스트를 입력 Text string - // UserId 에 멘션할 멤버의 고유 정보를 입력합니다. + // UserId 에 멘션할 멤버의 고유 정보를 입력 UserId int } From 53ec06d9b232ad46544d429616647f20143e0c39 Mon Sep 17 00:00:00 2001 From: JaeSang Yoo Date: Sun, 3 Nov 2024 20:26:41 +0900 Subject: [PATCH 14/14] docs: Finish documentations for kakaowork blockkits --- kakaowork/button_action.go | 164 +++++++++++++++------------------ kakaowork/button_block.go | 10 +- kakaowork/context_block.go | 11 ++- kakaowork/description_block.go | 2 +- kakaowork/header_block.go | 12 +-- kakaowork/image_block.go | 2 +- kakaowork/message.go | 17 ++-- kakaowork/section_block.go | 6 +- kakaowork/text_block.go | 12 +-- 9 files changed, 111 insertions(+), 125 deletions(-) diff --git a/kakaowork/button_action.go b/kakaowork/button_action.go index 9f346b6..8754e6f 100644 --- a/kakaowork/button_action.go +++ b/kakaowork/button_action.go @@ -3,25 +3,24 @@ package kakaowork import "encoding/json" type ButtonAction interface { - BubbleBlock ActionType() string + BubbleBlock } +// OpenSystemBrowserAction 은 Value 속성 값의 URL 을 시스템 브라우저로 연결합니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/buttonblock/#open_system_browser - type OpenSystemBrowserAction struct { - Name string `json:"name,omitempty"` + // Name 은 어떤 ButtonBlock 을 클릭했는지 구분하기 위해 사용, + // (주로 API 호출 시 사용) + Name string `json:"name,omitempty"` + // Value 는 시스템 브라우저에서 연결할 URL 을 설정 Value string `json:"value"` } -func (o OpenSystemBrowserAction) Type() string { - return "action" -} - -func (o OpenSystemBrowserAction) String() string { - return o.Value -} - +func (o OpenSystemBrowserAction) ActionType() string { return "open_system_browser" } +func (o OpenSystemBrowserAction) Type() string { return "action" } +func (o OpenSystemBrowserAction) String() string { return o.Value } func (o OpenSystemBrowserAction) MarshalJSON() ([]byte, error) { type Embed OpenSystemBrowserAction return json.Marshal(&struct { @@ -33,28 +32,26 @@ func (o OpenSystemBrowserAction) MarshalJSON() ([]byte, error) { }) } +// OpenInAppBrowserAction 은 URL 을 카카오워크 내부 팝업 브라우저로 호출할 수 있습니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/buttonblock/#open_inapp_browser - -func (o OpenSystemBrowserAction) ActionType() string { - return "open_system_browser" -} - type OpenInAppBrowserAction struct { - Name string `json:"name,omitempty"` - Value string `json:"value"` - Standalone bool `json:"standalone,omitempty"` - Width int `json:"width,omitempty"` - Height int `json:"height,omitempty"` -} - -func (o OpenInAppBrowserAction) Type() string { - return "action" -} - -func (o OpenInAppBrowserAction) String() string { - return o.Value + // Name 은 어떤 ButtonBlock 을 클릭했는지 구분하기 위해 사용, + // (주로 API 호출 시 사용) + Name string `json:"name,omitempty"` + // Value 는 카카오워크 내부 팝업에서 연결할 URL 을 설정 + Value string `json:"value"` + // Standalone 은 PC 인앱 브라우저를 별도 창으로 띄우려 할 때 true 로 설정 + Standalone bool `json:"standalone,omitempty"` + // Width 는 Standalone 사용 시 가로 사이즈를 설정 (기본 사이즈: 980) + Width int `json:"width,omitempty"` + // Height 는 Standalone 사용 시 세로 사이즈를 설정 (기본 사이즈: 720) + Height int `json:"height,omitempty"` } +func (o OpenInAppBrowserAction) ActionType() string { return "open_inapp_browser" } +func (o OpenInAppBrowserAction) Type() string { return "action" } +func (o OpenInAppBrowserAction) String() string { return o.Value } func (o OpenInAppBrowserAction) MarshalJSON() ([]byte, error) { if !o.Standalone { o.Width, o.Height = 0, 0 @@ -70,25 +67,20 @@ func (o OpenInAppBrowserAction) MarshalJSON() ([]byte, error) { }) } -func (o OpenInAppBrowserAction) ActionType() string { - return "open_inapp_browser" -} - +// OpenExternalAppAction 은 Custom App Scheme 을 통해 외부 앱 실행을 할 수 있습니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/buttonblock/#open_external_app - type OpenExternalAppAction struct { - Name string `json:"name,omitempty"` + // Name 은 어떤 ButtonBlock 을 클릭했는지 구분하기 위해 사용, + // (주로 API 호출 시 사용) + Name string `json:"name,omitempty"` + // Value 는 사용자의 디바이스에 연결할 Custom App Scheme 을 입력 Value string `json:"value"` } -func (o OpenExternalAppAction) Type() string { - return "action" -} - -func (o OpenExternalAppAction) String() string { - return o.Value -} - +func (o OpenExternalAppAction) ActionType() string { return "open_external_app" } +func (o OpenExternalAppAction) Type() string { return "action" } +func (o OpenExternalAppAction) String() string { return o.Value } func (o OpenExternalAppAction) MarshalJSON() ([]byte, error) { type Embed OpenExternalAppAction return json.Marshal(&struct { @@ -100,25 +92,21 @@ func (o OpenExternalAppAction) MarshalJSON() ([]byte, error) { }) } -func (o OpenExternalAppAction) ActionType() string { - return "open_external_app" -} - +// SubmitAction 은 반응형 메시지 봇을 개발 할 때 사용자의 입력 선택을 제공할 수 있습니다. +// Name 과 Value 를 고객 서버에 콜백으로 전달할 수 있습니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/buttonblock/#submit_action - type SubmitAction struct { - Name string `json:"name,omitempty"` + // Name 은 어떤 ButtonBlock 을 클릭했는지 구분하기 위해 사용, + // (SubmitAction 은 해당 항목 필수 설정) + Name string `json:"name"` + // Value 는 사용자가 전송하게 될 값을 입력 Value string `json:"value"` } -func (s SubmitAction) Type() string { - return "action" -} - -func (s SubmitAction) String() string { - return s.Value -} - +func (s SubmitAction) ActionType() string { return "submit_action" } +func (s SubmitAction) Type() string { return "action" } +func (s SubmitAction) String() string { return s.Value } func (s SubmitAction) MarshalJSON() ([]byte, error) { type Embed SubmitAction return json.Marshal(&struct { @@ -130,25 +118,20 @@ func (s SubmitAction) MarshalJSON() ([]byte, error) { }) } -func (s SubmitAction) ActionType() string { - return "submit_action" -} - +// CallModalAction 은 버튼 클릭 시 Modal 을 화면에 띄우고 사전에 등록한 블록 데이터를 요청합니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/buttonblock/#call_modal - type CallModalAction struct { - Name string `json:"name,omitempty"` + // Name 은 어떤 ButtonBlock 을 클릭했는지 구분하기 위해 사용, + // (주로 API 호출 시 사용) + Name string `json:"name,omitempty"` + // Value 에 사전 등록한 Modal 을 찾기 위한 초기 설정값을 입력 Value string `json:"value"` } -func (c CallModalAction) Type() string { - return "action" -} - -func (c CallModalAction) String() string { - return c.Value -} - +func (c CallModalAction) ActionType() string { return "call_modal" } +func (c CallModalAction) Type() string { return "action" } +func (c CallModalAction) String() string { return c.Value } func (c CallModalAction) MarshalJSON() ([]byte, error) { type Embed CallModalAction return json.Marshal(&struct { @@ -160,30 +143,31 @@ func (c CallModalAction) MarshalJSON() ([]byte, error) { }) } -func (c CallModalAction) ActionType() string { - return "call_modal" -} - +// ExclusiveAction 은 특정 플랙폼 또는 특정 OS 별로 다른 ButtonAction 을 설정할 수 있습니다. +// 설정은 특정 OS, 특정 플랫폼, Default 순으로 적용됩니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/buttonblock/#exclusive-action - type ExclusiveAction struct { + // Default 는 고객의 OS, 플랫폼에 설정된 값이 없을 때 기본 실행할 동작을 설정, + // (다른 항목 설정여부와 관계 없이 해당 항목 필수 설정) Default ButtonAction `json:"default"` - Pc ButtonAction `json:"pc,omitempty"` - Mobile ButtonAction `json:"mobile,omitempty"` + // Pc 는 PC 환경에서 MacOs, Windows 등 OS 값 설정이 없는 경우 실행할 동작을 설정 + Pc ButtonAction `json:"pc,omitempty"` + // Mobile 은 모바일 환경에서 Android, Ios 등 OS 값 설정이 없는 경우 실행할 동작을 설정 + Mobile ButtonAction `json:"mobile,omitempty"` + // Windows 에서 수행할 동작을 설정 Windows ButtonAction `json:"windows,omitempty"` - MacOs ButtonAction `json:"macos,omitempty"` + // MacOs 에서 수행할 동작을 설정 + MacOs ButtonAction `json:"macos,omitempty"` + // Android 에서 수행할 동작을 설정 Android ButtonAction `json:"android,omitempty"` - Ios ButtonAction `json:"ios,omitempty"` -} - -func (e ExclusiveAction) Type() string { - return "action" -} - -func (e ExclusiveAction) String() string { - return e.Default.String() + // Ios 에서 수행할 동작을 설정 + Ios ButtonAction `json:"ios,omitempty"` } +func (e ExclusiveAction) ActionType() string { return "exclusive" } +func (e ExclusiveAction) Type() string { return "action" } +func (e ExclusiveAction) String() string { return e.Default.String() } func (e ExclusiveAction) MarshalJSON() ([]byte, error) { type Embed ExclusiveAction return json.Marshal(&struct { @@ -194,7 +178,3 @@ func (e ExclusiveAction) MarshalJSON() ([]byte, error) { Embed: (Embed)(e), }) } - -func (e ExclusiveAction) ActionType() string { - return "exclusive" -} diff --git a/kakaowork/button_block.go b/kakaowork/button_block.go index ac1e14d..78e4c80 100644 --- a/kakaowork/button_block.go +++ b/kakaowork/button_block.go @@ -10,13 +10,13 @@ import ( type ButtonBlock struct { // Text 에 버튼이 표현할 텍스트를 입력 Text string `json:"text"` - // Style 은 버튼의 색상을 표현하며, 기본값은 회색 + // Style 은 버튼의 색상을 설정, 기본값은 회색 // - 기본, 회색: ButtonStyleDefault 혹은 ButtonStyleGray // - 강조, 파랑: ButtonStylePrimary 혹은 ButtonStyleBlue // - 위험, 빨강: ButtonStyleDanger 혹은 ButtonStyleRed Style ButtonStyle `json:"style,omitempty"` - // Action 에 버튼을 클릭했을 때 수행할 동작을 설정 - // 설정 가능한 값: OpenSystemBrowserAction, OpenInAppBrowserAction, OpenExternalAppAction, SubmitAction, CallModalAction, ExclusiveAction 참고 + // Action 에 버튼을 클릭했을 때 수행할 동작을 설정, + // 적용 가능한 ButtonAction: OpenSystemBrowserAction, OpenInAppBrowserAction, OpenExternalAppAction, SubmitAction, CallModalAction, ExclusiveAction 참고 Action ButtonAction `json:"action"` } @@ -26,9 +26,9 @@ const ( ButtonStyleDefault = ButtonStyle("default") ButtonStylePrimary = ButtonStyle("primary") ButtonStyleDanger = ButtonStyle("danger") - // ButtonStyleGray 는 ButtonStyleDefault 와 동일. + // ButtonStyleGray 는 ButtonStyleDefault 와 동일 ButtonStyleGray = ButtonStyleDefault - // ButtonStyleBlue 는 ButtonStylePrimary 와 동일 + // ButtonStyleBlue 는 ButtonStylePrimary 와 동일 ButtonStyleBlue = ButtonStylePrimary // ButtonStyleRed 는 ButtonStyleDanger 와 동일 ButtonStyleRed = ButtonStyleDanger diff --git a/kakaowork/context_block.go b/kakaowork/context_block.go index c14ac76..d800b83 100644 --- a/kakaowork/context_block.go +++ b/kakaowork/context_block.go @@ -2,11 +2,16 @@ package kakaowork import "encoding/json" -// ContextBlock is a combined block which can represent image and text +// ContextBlock 은 ImageBlock(좌측)과 TextBlock(우측)이 조합된 블록으로 +// 추가적인 정보를 덧붙여 표현하기 위해 사용됩니다. +// // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/contextblock/ type ContextBlock struct { - Content TextBlock `json:"content"` - Image ImageBlock `json:"image"` + // Content 는 필수 요소이며, 흐린 색의 폰트로 표시, + // TextBlock 의 InlineLink 를 활용하여 링크 적용 가능 + Content TextBlock `json:"content"` + // Image 는 필수 요소이며, 24px * 24px 사이즈로 고정 + Image ImageBlock `json:"image"` } func (c ContextBlock) Type() string { return "context" } diff --git a/kakaowork/description_block.go b/kakaowork/description_block.go index 3af67bc..83ed847 100644 --- a/kakaowork/description_block.go +++ b/kakaowork/description_block.go @@ -10,7 +10,7 @@ type DescriptionBlock struct { Content TextBlock `json:"content"` // Term 에 Content 의 내용을 요약하는 문구로 입력 Term string `json:"term"` - // Accent 는 Term 의 내용을 굵은 글씨체로 적용하며, 기본값은 false + // Accent 는 Term 의 내용을 굵은 글씨체로 적용, 기본값은 false Accent bool `json:"accent,omitempty"` } diff --git a/kakaowork/header_block.go b/kakaowork/header_block.go index f291b68..d817176 100644 --- a/kakaowork/header_block.go +++ b/kakaowork/header_block.go @@ -6,13 +6,13 @@ import "encoding/json" // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/headerblock/ type HeaderBlock struct { - // Text 에 내용을 입력 - // - 최대 20자까지 입력 가능 - // - 말풍선 사이즈에 따라 말줄임 처리 - // - 기본 Bold 로 처리 - // - 줄바꿈은 미지원 + // Text 에 내용을 입력. + // 최대 20자까지 입력 가능, + // 말풍선 사이즈에 따라 말줄임 처리, + // 기본 Bold 로 처리, + // 줄바꿈은 미지원, Text string `json:"text"` - // Style 에 색상 설정, 기본값은 흰색 + // Style 에 색상 설정, 기본값은 흰색. // 설정 가능한 값: HeaderStyleWhite, HeaderStyleBlue, HeaderStyleRed, HeaderStyleYellow Style HeaderStyle `json:"style"` } diff --git a/kakaowork/image_block.go b/kakaowork/image_block.go index 164edd2..03c9a80 100644 --- a/kakaowork/image_block.go +++ b/kakaowork/image_block.go @@ -6,7 +6,7 @@ import "encoding/json" // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/imagelinkblock/ type ImageBlock struct { - // Url 에 출력할 이미지의 URL 을 입력 + // Url 에 출력할 이미지의 URL 을 설정 Url string `json:"url" validate:"required,url"` } diff --git a/kakaowork/message.go b/kakaowork/message.go index 67c867e..ef26441 100644 --- a/kakaowork/message.go +++ b/kakaowork/message.go @@ -1,20 +1,21 @@ package kakaowork -// BubbleBlock is type casting interface for Message.Blocks. -// Implementing structs should expose only customizable properties. -// Other fixed properties should be handled during marshaling to JSON. +// BubbleBlock 은 Message.Blocks 에 넣을 타입 캐스팅 인터페이스입니다. +// 해당 인터페이스를 구현하는 구조체는 설정 가능한 속성만 노출해야합니다. +// 고정된 속성들은 MarshalJSON 에서 추가 처리되어야 합니다. type BubbleBlock interface { - // Type returns the message block type, equivalent to the JSON "type" property's value. + // Type 은 메시지 블록 타입을 반환해야합니다. JSON 의 "type" 속성을 나타냅니다. Type() string - // String is required for struct conversion fallback and value identification. + // String 은 구조체 변환 실패 혹은 값 구별을 위해 구현합니다. String() string - // MarshalJSON is overridden to hide fixed properties, like the "type" property. + // MarshalJSON 은 고정 속성값들을 숨기면서 원래 사양에 맞게 JSON 변환을 제공할 수 있어야 합니다. + // (대표적으로 "type" 속성) MarshalJSON() ([]byte, error) } type Message struct { - // Preview describes simple text for notification and chat preview. + // Preview 는 알림과 채팅 미리보기에서 사용할 간단한 텍스트를 입력 Preview string `json:"text"` - // Blocks describes the actual message contents. + // Blocks 은 실제 메시지 내용을 기술 Blocks []BubbleBlock `json:"blocks"` } diff --git a/kakaowork/section_block.go b/kakaowork/section_block.go index a0c2b32..e5461d4 100644 --- a/kakaowork/section_block.go +++ b/kakaowork/section_block.go @@ -7,11 +7,11 @@ import "encoding/json" // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/sectionblock/ type SectionBlock struct { - // Content 에 텍스트를 표현하는 속성 블럭을 입력 + // Content 에 텍스트를 표현하는 TextBlock 설정 Content TextBlock `json:"content"` - // Accessory 에 이미지를 표현하는 속성 블럭을 입력 (선택) + // Accessory 에 이미지를 표현하는 ImageBlock 설정 (선택) Accessory *ImageBlock `json:"accessory,omitempty"` - // ButtonAction 에 클릭 시 수행될 동작을 입력합 (선택) + // ButtonAction 에 클릭 시 수행될 ButtonAction 설정 (선택) Action ButtonAction `json:"action,omitempty"` } diff --git a/kakaowork/text_block.go b/kakaowork/text_block.go index 904f53a..9c7a21d 100644 --- a/kakaowork/text_block.go +++ b/kakaowork/text_block.go @@ -10,13 +10,13 @@ import ( // // Reference: https://docs.kakaoi.ai/kakao_work/blockkit/textblock/ type TextBlock struct { - // Text 에 표현할 텍스트를 입력 - // - 전체 텍스트를 \n을 포함하여 기술 - // - Inlines 서식을 적용할 텍스트까지 포함하여 작성 필요 - // - Inlines 와 정합성이 맞지 않을 경우, Inlines 의 String()를 우선으로 적용함 + // Text 에 표현할 텍스트를 입력. + // 전체 텍스트를 \n을 포함하여 기술, + // Inlines 서식을 적용할 텍스트까지 포함하여 작성 필요, + // Inlines 와 정합성이 맞지 않을 경우, Inlines 의 String()를 우선으로 적용함 Text string `json:"text"` - // Inlines 에 다양한 추가 서식을 적용하여 텍스트 및 스타일 설정 가능 - // 적용 가능한 서식은 InlineStyled, InlineLink, InlineMention 참고 + // Inlines 에 다양한 추가 서식을 적용하여 텍스트 및 스타일 설정 가능. + // 적용 가능한 서식: InlineStyled, InlineLink, InlineMention 참고 Inlines []Inline `json:"inlines,omitempty"` }