[LIB-13] Functional for working with strings moved to StringUtils
[chesshog-scanner.git] / src / main / java / org / hedgecode / chess / scanner / format / PGNTag.java
1 /*
2  * Copyright (c) 2019-2020. Developed by Hedgecode.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.hedgecode.chess.scanner.format;
18
19 import java.util.Arrays;
20 import java.util.Comparator;
21
22 import org.hedgecode.chess.scanner.StringUtils;
23
24 /**
25  * PGNTag
26  *
27  * @author Dmitry Samoshin aka gotty
28  */
29 public enum PGNTag {
30
31     EVENT         ( "Event",        true,        PGNTag.QUESTION      ),
32     SITE          ( "Site",         true,        PGNTag.QUESTION      ),
33     DATE          ( "Date",         true,        PGNTag.QUESTION_DATE ),
34     ROUND         ( "Round",        true,        PGNTag.QUESTION      ),
35     WHITE         ( "White",        true,        PGNTag.QUESTION      ),
36     BLACK         ( "Black",        true,        PGNTag.QUESTION      ),
37     RESULT        ( "Result",       true,        PGNTag.NON_RESULT    ),
38     WHITE_TITLE   ( "WhiteTitle",   false,       PGNTag.HYPHEN        ),
39     BLACK_TITLE   ( "BlackTitle",   false,       PGNTag.HYPHEN        ),
40     WHITE_ELO     ( "WhiteElo",     false,       PGNTag.HYPHEN        ),
41     BLACK_ELO     ( "BlackElo",     false,       PGNTag.HYPHEN        ),
42     WHITE_USCF    ( "WhiteUSCF",    false,       PGNTag.HYPHEN        ),
43     BLACK_USCF    ( "BlackUSCF",    false,       PGNTag.HYPHEN        ),
44     WHITE_NA      ( "WhiteNA",      false,       PGNTag.HYPHEN        ),
45     BLACK_NA      ( "BlackNA",      false,       PGNTag.HYPHEN        ),
46     WHITE_TYPE    ( "WhiteType",    false,       PGNTag.HYPHEN        ),
47     BLACK_TYPE    ( "BlackType",    false,       PGNTag.HYPHEN        ),
48     EVENT_DATE    ( "EventDate",    false,       PGNTag.QUESTION_DATE ),
49     EVENT_SPONSOR ( "EventSponsor", false,       PGNTag.EMPTY         ),
50     SECTION       ( "Section",      false,       PGNTag.EMPTY         ),
51     STAGE         ( "Stage",        false,       PGNTag.EMPTY         ),
52     BOARD         ( "Board",        false,       PGNTag.EMPTY         ),
53     OPENING       ( "Opening",      false,       PGNTag.EMPTY         ),
54     VARIATION     ( "Variation",    false,       PGNTag.EMPTY         ),
55     SUBVARIATION  ( "SubVariation", false,       PGNTag.EMPTY         ),
56     ECO           ( "ECO",          false,       PGNTag.EMPTY         ),
57     NIC           ( "NIC",          false,       PGNTag.EMPTY         ),
58     TIME          ( "Time",         false,       PGNTag.QUESTION_TIME ),
59     UTC_TIME      ( "UTCTime",      false,       PGNTag.QUESTION_TIME ),
60     UTC_DATE      ( "UTCDate",      false,       PGNTag.QUESTION_DATE ),
61     TIME_CONTROL  ( "TimeControl",  false,       PGNTag.QUESTION      ),
62     SETUP         ( "SetUp",        false,       PGNTag.ZERO          ),
63     FEN           ( "FEN",          false,       PGNTag.EMPTY         ),
64     TERMINATION   ( "Termination",  false,       PGNTag.EMPTY         ),
65     ANNOTATOR     ( "Annotator",    false,       PGNTag.EMPTY         ),
66     MODE          ( "Mode",         false,       PGNTag.EMPTY         ),
67     PLY_COUNT     ( "PlyCount",     false,       PGNTag.EMPTY         );
68
69     // todo: -> PGNConstants
70     public static final String EMPTY = "";
71     public static final String HYPHEN = "-";
72     public static final String ZERO = "0";
73     public static final String QUESTION = "?";
74     public static final String QUESTION_DATE = "????.??.??";
75     public static final String QUESTION_TIME = "??:??:??";
76     public static final String NON_RESULT = "*";
77
78     public static final String TAG_FORMAT = "[%s \"%s\"]";
79
80     public static final char[] TAG_SHIELD_CHARS = { '\\', '"' };
81
82     private String tagName;
83     private boolean isRequired;
84     private String defaultValue;
85
86     PGNTag(String name, boolean required, String defValue) {
87         tagName = name;
88         isRequired = required;
89         defaultValue = defValue;
90     }
91
92     public String getName() {
93         return tagName;
94     }
95
96     public boolean isRequired() {
97         return isRequired;
98     }
99
100     public String defaultValue() {
101         return defaultValue;
102     }
103
104     public static String formatTagValue(String tagValue) {
105         return StringUtils.shield(
106                 tagValue, TAG_SHIELD_CHARS
107         );
108     }
109
110     public static PGNTag[] tags() {
111         PGNTag[] tags = values();
112         Arrays.sort(
113                 tags, new TagComparator()
114         );
115         return tags;
116     }
117
118     static class TagComparator implements Comparator<PGNTag> {
119
120         @Override
121         public int compare(PGNTag tag1, PGNTag tag2) {
122             if (tag1.isRequired && tag2.isRequired) {
123                 return tag1.ordinal() - tag2.ordinal();
124             } else {
125                 return tag1.isRequired ? -1
126                         : tag2.isRequired ? 1
127                         : tag1.name().compareTo(tag2.name());
128             }
129         }
130
131     }
132
133 }