/*

Package emojilib is a port of the Emoji keyword library to Go

Installation

Just go get the package:

    go get -u github.com/peterhellberg/emojilib

Usage

A small usage example

		package main

		import (
			"fmt"

			"github.com/peterhellberg/emojilib"
		)

		func main() {
			fmt.Println(emojilib.ReplaceWithPadding("I :green_heart: You!"))
		}

*/
package emojilib

import "errors"

//go:generate go run _generator/main.go

// Emojis contain emojis keyed on their name
type Emojis map[string]Emoji

// Emoji contains the keywords, char and category for an emoji
type Emoji struct {
	Keywords []string `json:"keywords"`
	Char     string   `json:"char"`
	Category string   `json:"category"`
}

// ErrUnknownEmoji is returned from Find if provided with a unknown emoji name
var ErrUnknownEmoji = errors.New("unknown emoji")

// ErrUnknownKeyword is returned from Keyword if provided with a unknown keyword
var ErrUnknownKeyword = errors.New("unknown keyword")

// Find returns an Emoji if provided with a known name
func Find(n string) (Emoji, error) {
	if e, ok := emojis[n]; ok {
		return e, nil
	}

	return Emoji{}, ErrUnknownEmoji
}

// Keyword returns Emojis for the given keyword
func Keyword(k string) ([]Emoji, error) {
	if names, ok := keywordLookup[k]; ok {
		es := []Emoji{}

		for _, n := range names {
			es = append(es, emojis[n])
		}

		return es, nil
	}

	return []Emoji{}, ErrUnknownKeyword
}

// All returns all the emojis
func All() Emojis {
	return emojis
}

// Replace takes a string and replaces all emoji names with their emoji character
func Replace(s string) string {
	return emojiReplacer.Replace(s)
}

// ReplaceWithPadding takes a string and replaces all emoji names with their
// emoji character and a space in order to display better in terminals
func ReplaceWithPadding(s string) string {
	return emojiPaddedReplacer.Replace(s)
}