1package faker
  2
  3import (
  4	"reflect"
  5	"strings"
  6
  7	"golang.org/x/text/cases"
  8	"golang.org/x/text/language"
  9
 10	"github.com/go-faker/faker/v4/pkg/options"
 11)
 12
 13var wordList = []string{
 14	"alias", "consequatur", "aut", "perferendis", "sit", "voluptatem",
 15	"accusantium", "doloremque", "aperiam", "eaque", "ipsa", "quae", "ab",
 16	"illo", "inventore", "veritatis", "et", "quasi", "architecto",
 17	"beatae", "vitae", "dicta", "sunt", "explicabo", "aspernatur", "aut",
 18	"odit", "aut", "fugit", "sed", "quia", "consequuntur", "magni",
 19	"dolores", "eos", "qui", "ratione", "voluptatem", "sequi", "nesciunt",
 20	"neque", "dolorem", "ipsum", "quia", "dolor", "sit", "amet",
 21	"consectetur", "adipisci", "velit", "sed", "quia", "non", "numquam",
 22	"eius", "modi", "tempora", "incidunt", "ut", "labore", "et", "dolore",
 23	"magnam", "aliquam", "quaerat", "voluptatem", "ut", "enim", "ad",
 24	"minima", "veniam", "quis", "nostrum", "exercitationem", "ullam",
 25	"corporis", "nemo", "enim", "ipsam", "voluptatem", "quia", "voluptas",
 26	"sit", "suscipit", "laboriosam", "nisi", "ut", "aliquid", "ex", "ea",
 27	"commodi", "consequatur", "quis", "autem", "vel", "eum", "iure",
 28	"reprehenderit", "qui", "in", "ea", "voluptate", "velit", "esse",
 29	"quam", "nihil", "molestiae", "et", "iusto", "odio", "dignissimos",
 30	"ducimus", "qui", "blanditiis", "praesentium", "laudantium", "totam",
 31	"rem", "voluptatum", "deleniti", "atque", "corrupti", "quos",
 32	"dolores", "et", "quas", "molestias", "excepturi", "sint",
 33	"occaecati", "cupiditate", "non", "provident", "sed", "ut",
 34	"perspiciatis", "unde", "omnis", "iste", "natus", "error",
 35	"similique", "sunt", "in", "culpa", "qui", "officia", "deserunt",
 36	"mollitia", "animi", "id", "est", "laborum", "et", "dolorum", "fuga",
 37	"et", "harum", "quidem", "rerum", "facilis", "est", "et", "expedita",
 38	"distinctio", "nam", "libero", "tempore", "cum", "soluta", "nobis",
 39	"est", "eligendi", "optio", "cumque", "nihil", "impedit", "quo",
 40	"porro", "quisquam", "est", "qui", "minus", "id", "quod", "maxime",
 41	"placeat", "facere", "possimus", "omnis", "voluptas", "assumenda",
 42	"est", "omnis", "dolor", "repellendus", "temporibus", "autem",
 43	"quibusdam", "et", "aut", "consequatur", "vel", "illum", "qui",
 44	"dolorem", "eum", "fugiat", "quo", "voluptas", "nulla", "pariatur",
 45	"at", "vero", "eos", "et", "accusamus", "officiis", "debitis", "aut",
 46	"rerum", "necessitatibus", "saepe", "eveniet", "ut", "et",
 47	"voluptates", "repudiandae", "sint", "et", "molestiae", "non",
 48	"recusandae", "itaque", "earum", "rerum", "hic", "tenetur", "a",
 49	"sapiente", "delectus", "ut", "aut", "reiciendis", "voluptatibus",
 50	"maiores", "doloribus", "asperiores", "repellat",
 51}
 52
 53// DataFaker generates randomized Words, Sentences and Paragraphs
 54type DataFaker interface {
 55	Word(v reflect.Value) (interface{}, error)
 56	Sentence(v reflect.Value) (interface{}, error)
 57	Paragraph(v reflect.Value) (interface{}, error)
 58}
 59
 60// GetLorem returns a new DataFaker interface of Lorem struct
 61func GetLorem() DataFaker {
 62	lorem := &Lorem{}
 63	return lorem
 64}
 65
 66// Lorem struct
 67type Lorem struct {
 68}
 69
 70func (l Lorem) word() string {
 71	return randomElementFromSliceString(wordList)
 72}
 73
 74// Word returns a word from the wordList const
 75func (l Lorem) Word(v reflect.Value) (interface{}, error) {
 76	return l.word(), nil
 77}
 78
 79// Word get a word randomly in string
 80func Word(opts ...options.OptionFunc) string {
 81	i := Lorem{}
 82	return singleFakeData(WORD, func() interface{} {
 83		return i.word()
 84	}, opts...).(string)
 85}
 86
 87func (l Lorem) sentence(sentence *strings.Builder) *strings.Builder {
 88	r, _ := RandomInt(0, len(wordList)-1, 6)
 89	size := len(r)
 90	for key, val := range r {
 91		if key == 0 {
 92			sentence.WriteString(cases.Title(language.Und, cases.NoLower).String(wordList[val]))
 93		} else {
 94			sentence.WriteString(wordList[val])
 95		}
 96		if key != size-1 {
 97			sentence.WriteString(" ")
 98		}
 99	}
100
101	sentence.WriteString(".")
102	return sentence
103}
104
105// Sentence returns a sentence using the wordList const
106func (l Lorem) Sentence(_ reflect.Value) (interface{}, error) {
107	sentence := l.sentence(&strings.Builder{})
108	return sentence.String(), nil
109}
110
111// Sentence get a sentence randomly in string
112func Sentence(opts ...options.OptionFunc) string {
113	i := Lorem{}
114	return singleFakeData(SENTENCE, func() interface{} {
115		return i.sentence(&strings.Builder{}).String()
116	}, opts...).(string)
117}
118
119func (l Lorem) paragraph() string {
120	paragraph := &strings.Builder{}
121	size := rand.Intn(10) + 1
122	for i := 0; i < size; i++ {
123		l.sentence(paragraph)
124		if i != size-1 {
125			paragraph.WriteString(" ")
126		}
127	}
128	return paragraph.String()
129}
130
131// Paragraph returns a series of sentences as a paragraph using the wordList const
132func (l Lorem) Paragraph(v reflect.Value) (interface{}, error) {
133	return l.paragraph(), nil
134}
135
136// Paragraph get a paragraph randomly in string
137func Paragraph(opts ...options.OptionFunc) string {
138	i := Lorem{}
139	return singleFakeData(PARAGRAPH, func() interface{} {
140		return i.paragraph()
141	}, opts...).(string)
142}