notification-lark/lark_card.go (190 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package lark
import "encoding/json"
// CardLink represents the URLs for different platforms.
type CardLink struct {
URL string `json:"url,omitempty"`
PCURL string `json:"pc_url,omitempty"`
IOSURL string `json:"ios_url,omitempty"`
AndroidURL string `json:"android_url,omitempty"`
}
// Text represents a text component with optional internationalization.
type Text struct {
Tag string `json:"tag,omitempty"`
Content string `json:"content,omitempty"`
I18n *I18n `json:"i18n,omitempty"`
TextSize string `json:"text_size,omitempty"`
TextAlign string `json:"text_align,omitempty"`
TextColor string `json:"text_color,omitempty"`
Icon *Icon `json:"icon,omitempty"`
}
// I18n represents internationalized text.
type I18n struct {
ZhCn string `json:"zh_cn,omitempty"`
EnUs string `json:"en_us,omitempty"`
}
// TextTag represents a text tag component.
type TextTag struct {
Tag string `json:"tag,omitempty"`
Text *Text `json:"text,omitempty"`
Color string `json:"color,omitempty"`
}
// MarshalJSON customizes the JSON encoding for TextTag.
func (tt *TextTag) MarshalJSON() ([]byte, error) {
tt.Tag = "text_tag"
return json.Marshal(*tt)
}
// Icon represents an icon component.
type Icon struct {
Tag string `json:"tag,omitempty"`
Token string `json:"token,omitempty"`
Color string `json:"color,omitempty"`
ImgKey string `json:"img_key,omitempty"`
Style *struct {
Color Color `json:"color,omitempty"`
} `json:"style,omitempty"`
}
// Header represents the header component of a card.
type Header struct {
Title *Text `json:"title,omitempty"`
Subtitle *Text `json:"subtitle,omitempty"`
TextTagList []TextTag `json:"text_tag_list,omitempty"`
Template Template `json:"template,omitempty"`
UdIcon *Icon `json:"ud_icon,omitempty"`
}
// Element represents a generic element in a card.
type Element struct {
*PlainText
*Button
}
// MarshalJSON customizes the JSON encoding for Element.
func (e *Element) MarshalJSON() ([]byte, error) {
if e.PlainText != nil {
return json.Marshal(e.PlainText)
}
return json.Marshal(e.Button)
}
// Column represents a column in a ColumnSet.
type Column struct {
Tag string `json:"tag,omitempty"`
Elements []Element `json:"elements,omitempty"`
Width string `json:"width,omitempty"`
Weight int `json:"weight,omitempty"`
BackgroundStyle string `json:"background_style,omitempty"`
VerticalAlign string `json:"vertical_align,omitempty"`
VerticalSpacing string `json:"vertical_spacing,omitempty"`
Padding string `json:"padding,omitempty"`
}
// MarshalJSON customizes the JSON encoding for Column.
func (c *Column) MarshalJSON() ([]byte, error) {
c.Tag = "column"
return json.Marshal(*c)
}
// ColumnSet represents a set of columns.
type ColumnSet struct {
*Show
*Action
}
// MarshalJSON customizes the JSON encoding for ColumnSet.
func (cs *ColumnSet) MarshalJSON() ([]byte, error) {
if cs.Show != nil {
cs.Show.Tag = "column_set"
return json.Marshal(*cs.Show)
}
if cs.Action != nil {
cs.Action.Tag = "action"
return json.Marshal(*cs.Action)
}
return nil, nil
}
// Show represents the display properties of a ColumnSet.
type Show struct {
Tag string `json:"tag"`
FlexMode string `json:"flex_mode,omitempty"`
HorizontalSpacing string `json:"horizontal_spacing,omitempty"`
BackgroundStyle string `json:"background_style,omitempty"`
Columns []Column `json:"columns,omitempty"`
}
// Action represents actions in a ColumnSet.
type Action struct {
Tag string `json:"tag"`
Actions []*Button `json:"actions,omitempty"`
}
// I18nElements represents internationalized elements.
type I18nElements struct {
ZhCn []ColumnSet `json:"zh_cn,omitempty"`
EnUs []ColumnSet `json:"en_us,omitempty"`
}
// Behavior represents the behavior of a button.
type Behavior struct {
Type string `json:"type"`
DefaultURL string `json:"default_url"`
AndroidURL string `json:"android_url"`
IOSURL string `json:"ios_url"`
PCURL string `json:"pc_url"`
}
// Button represents a button component.
type Button struct {
Tag string `json:"tag,omitempty"`
Width string `json:"width,omitempty"`
Text *Text `json:"text,omitempty"`
Behaviors []Behavior `json:"behaviors,omitempty"`
Type string `json:"type,omitempty"`
HoverTips *Text `json:"hover_tips,omitempty"`
Value map[string]any `json:"value,omitempty"`
}
// MarshalJSON customizes the JSON encoding for Button.
func (b *Button) MarshalJSON() ([]byte, error) {
b.Tag = "button"
return json.Marshal(*b)
}
// PlainText represents plain text component.
type PlainText struct {
Tag string `json:"tag,omitempty"`
Text *Text `json:"text,omitempty"`
Icon *Icon `json:"icon,omitempty"`
}
// Summary represents the summary information of a card.
type Summary struct {
Content string `json:"content,omitempty"`
I18nContent map[string]string `json:"i18n_content,omitempty"`
}
// TextSize represents the custom text size configuration.
type TextSize struct {
Default string `json:"default,omitempty"`
PC string `json:"pc,omitempty"`
Mobile string `json:"mobile,omitempty"`
}
// ConfigColor represents the custom color configuration.
type ConfigColor struct {
LightMode string `json:"light_mode,omitempty"`
DarkMode string `json:"dark_mode,omitempty"`
}
// Style represents the custom font size and color configuration.
type Style struct {
TextSize map[string]TextSize `json:"text_size,omitempty"`
Color map[string]ConfigColor `json:"color,omitempty"`
}
// Config represents the configuration of a card.
type Config struct {
StreamingMode *bool `json:"streaming_mode,omitempty"`
Summary *Summary `json:"summary,omitempty"`
EnableForward *bool `json:"enable_forward,omitempty"`
UpdateMulti *bool `json:"update_multi,omitempty"`
WidthMode string `json:"width_mode,omitempty"`
UseCustomTranslation *bool `json:"use_custom_translation,omitempty"`
EnableForwardInteraction *bool `json:"enable_forward_interaction,omitempty"`
Style Style `json:"style,omitempty"`
}
// Card represents the entire JSON structure of a card.
type Card struct {
Config *Config `json:"config"`
CardLink *CardLink `json:"card_link,omitempty"`
I18nElements *I18nElements `json:"i18n_elements,omitempty"`
Header *Header `json:"header,omitempty"`
}
// Template represents theme styles enumeration.
type Template string
const (
ThemeBlue Template = "blue"
ThemeWathet Template = "wathet"
ThemeTurquoise Template = "turquoise"
ThemeGreen Template = "green"
ThemeYellow Template = "yellow"
ThemeOrange Template = "orange"
ThemeRed Template = "red"
ThemeCarmine Template = "carmine"
ThemeViolet Template = "violet"
ThemePurple Template = "purple"
ThemeIndigo Template = "indigo"
ThemeGrey Template = "grey"
ThemeDefault Template = "default"
)
// Color represents color effects enumeration.
type Color string
const (
ColorNeutral Color = "neutral"
ColorBlue Color = "blue"
ColorTurquoise Color = "turquoise"
ColorLime Color = "lime"
ColorOrange Color = "orange"
ColorViolet Color = "violet"
ColorIndigo Color = "indigo"
ColorWathet Color = "wathet"
ColorGreen Color = "green"
ColorYellow Color = "yellow"
ColorRed Color = "red"
ColorPurple Color = "purple"
ColorCarmine Color = "carmine"
)