10d6fecc83d0848ebcbd09eabbb8cd19cc6d70de
[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 /**
23  * PGNTag
24  *
25  * @author Dmitry Samoshin aka gotty
26  */
27 public enum PGNTag {
28
29     EVENT         ( "Event",        true,        PGNTag.QUESTION      ),
30     SITE          ( "Site",         true,        PGNTag.QUESTION      ),
31     DATE          ( "Date",         true,        PGNTag.QUESTION_DATE ),
32     ROUND         ( "Round",        true,        PGNTag.QUESTION      ),
33     WHITE         ( "White",        true,        PGNTag.QUESTION      ),
34     BLACK         ( "Black",        true,        PGNTag.QUESTION      ),
35     RESULT        ( "Result",       true,        PGNTag.NON_RESULT    ),
36     WHITE_TITLE   ( "WhiteTitle",   false,       PGNTag.HYPHEN        ),
37     BLACK_TITLE   ( "BlackTitle",   false,       PGNTag.HYPHEN        ),
38     WHITE_ELO     ( "WhiteElo",     false,       PGNTag.HYPHEN        ),
39     BLACK_ELO     ( "BlackElo",     false,       PGNTag.HYPHEN        ),
40     WHITE_USCF    ( "WhiteUSCF",    false,       PGNTag.HYPHEN        ),
41     BLACK_USCF    ( "BlackUSCF",    false,       PGNTag.HYPHEN        ),
42     WHITE_NA      ( "WhiteNA",      false,       PGNTag.HYPHEN        ),
43     BLACK_NA      ( "BlackNA",      false,       PGNTag.HYPHEN        ),
44     WHITE_TYPE    ( "WhiteType",    false,       PGNTag.HYPHEN        ),
45     BLACK_TYPE    ( "BlackType",    false,       PGNTag.HYPHEN        ),
46     EVENT_DATE    ( "EventDate",    false,       PGNTag.QUESTION_DATE ),
47     EVENT_SPONSOR ( "EventSponsor", false,       PGNTag.EMPTY         ),
48     SECTION       ( "Section",      false,       PGNTag.EMPTY         ),
49     STAGE         ( "Stage",        false,       PGNTag.EMPTY         ),
50     BOARD         ( "Board",        false,       PGNTag.EMPTY         ),
51     OPENING       ( "Opening",      false,       PGNTag.EMPTY         ),
52     VARIATION     ( "Variation",    false,       PGNTag.EMPTY         ),
53     SUBVARIATION  ( "SubVariation", false,       PGNTag.EMPTY         ),
54     ECO           ( "ECO",          false,       PGNTag.EMPTY         ),
55     NIC           ( "NIC",          false,       PGNTag.EMPTY         ),
56     TIME          ( "Time",         false,       PGNTag.QUESTION_TIME ),
57     UTC_TIME      ( "UTCTime",      false,       PGNTag.QUESTION_TIME ),
58     UTC_DATE      ( "UTCDate",      false,       PGNTag.QUESTION_DATE ),
59     TIME_CONTROL  ( "TimeControl",  false,       PGNTag.QUESTION      ),
60     SETUP         ( "SetUp",        false,       PGNTag.ZERO          ),
61     FEN           ( "FEN",          false,       PGNTag.EMPTY         ),
62     TERMINATION   ( "Termination",  false,       PGNTag.EMPTY         ),
63     ANNOTATOR     ( "Annotator",    false,       PGNTag.EMPTY         ),
64     MODE          ( "Mode",         false,       PGNTag.EMPTY         ),
65     PLY_COUNT     ( "PlyCount",     false,       PGNTag.EMPTY         );
66
67     public static final String EMPTY = "";
68     public static final String HYPHEN = "-";
69     public static final String ZERO = "0";
70     public static final String QUESTION = "?";
71     public static final String QUESTION_DATE = "????.??.??";
72     public static final String QUESTION_TIME = "??:??:??";
73     public static final String NON_RESULT = "*";
74
75     public static final String TAG_FORMAT = "[%s \"%s\"]";
76
77     private String tagName;
78     private boolean isRequired;
79     private String defaultValue;
80
81     PGNTag(String name, boolean required, String defValue) {
82         tagName = name;
83         isRequired = required;
84         defaultValue = defValue;
85     }
86
87     public String getName() {
88         return tagName;
89     }
90
91     public boolean isRequired() {
92         return isRequired;
93     }
94
95     public String defaultValue() {
96         return defaultValue;
97     }
98
99     public static PGNTag[] tags() {
100         PGNTag[] tags = values();
101         Arrays.sort(
102                 tags, new TagComparator()
103         );
104         return tags;
105     }
106
107     static class TagComparator implements Comparator<PGNTag> {
108
109         @Override
110         public int compare(PGNTag tag1, PGNTag tag2) {
111             if (tag1.isRequired && tag2.isRequired) {
112                 return tag1.ordinal() - tag2.ordinal();
113             } else {
114                 return tag1.isRequired ? -1
115                         : tag2.isRequired ? 1
116                         : tag1.name().compareTo(tag2.name());
117             }
118         }
119
120     }
121
122 }