1package match
2
3import (
4	"fmt"
5	"strings"
6)
7
8type PrefixSuffix struct {
9	Prefix, Suffix string
10}
11
12func NewPrefixSuffix(p, s string) PrefixSuffix {
13	return PrefixSuffix{p, s}
14}
15
16func (self PrefixSuffix) Index(s string) (int, []int) {
17	prefixIdx := strings.Index(s, self.Prefix)
18	if prefixIdx == -1 {
19		return -1, nil
20	}
21
22	suffixLen := len(self.Suffix)
23	if suffixLen <= 0 {
24		return prefixIdx, []int{len(s) - prefixIdx}
25	}
26
27	if (len(s) - prefixIdx) <= 0 {
28		return -1, nil
29	}
30
31	segments := acquireSegments(len(s) - prefixIdx)
32	for sub := s[prefixIdx:]; ; {
33		suffixIdx := strings.LastIndex(sub, self.Suffix)
34		if suffixIdx == -1 {
35			break
36		}
37
38		segments = append(segments, suffixIdx+suffixLen)
39		sub = sub[:suffixIdx]
40	}
41
42	if len(segments) == 0 {
43		releaseSegments(segments)
44		return -1, nil
45	}
46
47	reverseSegments(segments)
48
49	return prefixIdx, segments
50}
51
52func (self PrefixSuffix) Len() int {
53	return lenNo
54}
55
56func (self PrefixSuffix) Match(s string) bool {
57	return strings.HasPrefix(s, self.Prefix) && strings.HasSuffix(s, self.Suffix)
58}
59
60func (self PrefixSuffix) String() string {
61	return fmt.Sprintf("<prefix_suffix:[%s,%s]>", self.Prefix, self.Suffix)
62}
63