1#  Copyright (C) 2021 The Android Open Source Project
2#
3#  Licensed under the Apache License, Version 2.0 (the "License");
4#  you may not use this file except in compliance with the License.
5#  You may obtain a copy of the License at
6#
7#       http://www.apache.org/licenses/LICENSE-2.0
8#
9#  Unless required by applicable law or agreed to in writing, software
10#  distributed under the License is distributed on an "AS IS" BASIS,
11#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12#  See the License for the specific language governing permissions and
13#  limitations under the License.
14
15import argparse
16
17import classpaths_pb2
18
19import google.protobuf.json_format as json_format
20import google.protobuf.text_format as text_format
21
22
23def encode(args):
24    pb = classpaths_pb2.ExportedClasspathsJars()
25    if args.format == 'json':
26        json_format.Parse(args.input.read(), pb)
27    else:
28        text_format.Parse(args.input.read(), pb)
29    args.output.write(pb.SerializeToString())
30    args.input.close()
31    args.output.close()
32
33
34def decode(args):
35    pb = classpaths_pb2.ExportedClasspathsJars()
36    pb.ParseFromString(args.input.read())
37    if args.format == 'json':
38        args.output.write(json_format.MessageToJson(pb))
39    else:
40        args.output.write(text_format.MessageToString(pb).encode('utf_8'))
41    args.input.close()
42    args.output.close()
43
44
45def main():
46    parser = argparse.ArgumentParser('Convert classpaths.proto messages between binary and '
47                                     'human-readable formats.')
48    parser.add_argument('-f', '--format', default='textproto',
49                        help='human-readable format, either json or text(proto), '
50                             'defaults to textproto')
51    parser.add_argument('-i', '--input',
52                        nargs='?', type=argparse.FileType('rb'), default=sys.stdin.buffer)
53    parser.add_argument('-o', '--output',
54                        nargs='?', type=argparse.FileType('wb'),
55                        default=sys.stdout.buffer)
56
57    subparsers = parser.add_subparsers()
58
59    parser_encode = subparsers.add_parser('encode',
60                                          help='convert classpaths protobuf message from '
61                                               'JSON to binary format',
62                                          parents=[parser], add_help=False)
63
64    parser_encode.set_defaults(func=encode)
65
66    parser_decode = subparsers.add_parser('decode',
67                                          help='print classpaths config in JSON format',
68                                          parents=[parser], add_help=False)
69    parser_decode.set_defaults(func=decode)
70
71    args = parser.parse_args()
72    args.func(args)
73
74
75if __name__ == '__main__':
76    main()
77