11import argparse
22import logging
33import sys
4- from typing import Tuple
54
65from saluki .consume import consume
76from saluki .listen import listen
7+ from saluki .utils import parse_kafka_uri
88
99logger = logging .getLogger ("saluki" )
1010logging .basicConfig (level = logging .INFO )
1414_CONSUME = "consume"
1515
1616
17- def parse_kafka_uri (uri : str ) -> Tuple [str , str ]:
18- """Parse Kafka connection URI.
19-
20- A broker hostname/ip must be present.
21- If username is provided, a SASL mechanism must also be provided.
22- Any other validation must be performed in the calling code.
23- """
24- security_protocol , tail = uri .split ("+" ) if "+" in uri else ("" , uri )
25- sasl_mechanism , tail = tail .split ("\\ " ) if "\\ " in tail else ("" , tail )
26- username , tail = tail .split ("@" ) if "@" in tail else ("" , tail )
27- broker , topic = tail .split ("/" ) if "/" in tail else (tail , "" )
28- if not broker :
29- raise RuntimeError (
30- f"Unable to parse URI { uri } , broker not defined. URI should be of form"
31- f" [PROTOCOL+SASL_MECHANISM\\ username@]broker:9092"
32- )
33- if username and not (security_protocol and sasl_mechanism ):
34- raise RuntimeError (
35- f"Unable to parse URI { uri } , PROTOCOL or SASL_MECHANISM not defined."
36- f" URI should be of form [PROTOCOL+SASL_MECHANISM\\ username@]broker:9092"
37- )
38- return broker , topic
39-
40-
4117def main () -> None :
4218 parser = argparse .ArgumentParser (
4319 prog = "saluki" ,
4420 description = "serialise/de-serialise flatbuffers and consume/produce from/to kafka" ,
4521 )
4622
4723 parent_parser = argparse .ArgumentParser (add_help = False )
48- parent_parser .add_argument ("topic" , type = str , help = "Kafka topic. format is broker<:port>/topic" )
24+ parent_parser .add_argument (
25+ "topic" , type = str , help = "Kafka topic. format is broker<:port>/topic"
26+ )
4927
5028 parent_parser .add_argument (
5129 "-X" ,
@@ -63,7 +41,9 @@ def main() -> None:
6341 type = argparse .FileType ("a" ),
6442 )
6543
66- sub_parsers = parser .add_subparsers (help = "sub-command help" , required = True , dest = "command" )
44+ sub_parsers = parser .add_subparsers (
45+ help = "sub-command help" , required = True , dest = "command"
46+ )
6747
6848 consumer_parser = argparse .ArgumentParser (add_help = False )
6949 consumer_parser .add_argument (
@@ -88,16 +68,24 @@ def main() -> None:
8868 consumer_mode_parser .add_argument (
8969 "-o" , "--offset" , help = "offset to consume from" , type = int , required = False
9070 )
91- consumer_mode_parser .add_argument ("-s" , "--schema" , required = False , default = "auto" , type = str )
92- consumer_mode_parser .add_argument ("-g" , "--go-forwards" , required = False , action = "store_true" )
93- consumer_mode_parser .add_argument ("-p" , "--partition" , required = False , type = int , default = 0 )
71+ consumer_mode_parser .add_argument (
72+ "-s" , "--schema" , required = False , default = "auto" , type = str
73+ )
74+ consumer_mode_parser .add_argument (
75+ "-g" , "--go-forwards" , required = False , action = "store_true"
76+ )
77+ consumer_mode_parser .add_argument (
78+ "-p" , "--partition" , required = False , type = int , default = 0
79+ )
9480
9581 listen_parser = sub_parsers .add_parser (
9682 _LISTEN ,
9783 help = "listen mode - listen until KeyboardInterrupt" ,
9884 parents = [parent_parser , consumer_parser ],
9985 )
100- listen_parser .add_argument ("-p" , "--partition" , required = False , type = int , default = None )
86+ listen_parser .add_argument (
87+ "-p" , "--partition" , required = False , type = int , default = None
88+ )
10189
10290 if len (sys .argv ) == 1 :
10391 parser .print_help ()
0 commit comments