generatePathExtensions method
Implementation
String generatePathExtensions(
String parent,
) {
var relativePath = path.substring(parent.length);
if (parent.isNotEmpty && relativePath.startsWith('/')) {
relativePath = relativePath.substring(1);
}
final fullPathParams = findPathParameters(path);
final relativePathParams = findPathParameters(relativePath);
final pathWithParams = path.replaceAllMapped(
RegExp(r':([\d\w_]+)'),
(m) => '\$${m[1]}',
);
var pathClass = path.replaceAll('/', '').replaceAll(':', '').toTypeName();
var parentPathClass = pathClass.isEmpty
? 'HypenPath'
: parent.replaceAll('/', '').replaceAll(':', '').toTypeName();
if (pathClass.isEmpty) {
pathClass = 'HypenRootPath';
}
if (parentPathClass.isEmpty) {
parentPathClass = 'HypenRootPath';
}
if (relativePath == '/') {
relativePath = 'root';
}
relativePath = relativePath.replaceAll(':', '');
final ret = path == parent
? ''
: '''
class $pathClass {
const $pathClass(
${fullPathParams.map((p) => 'required this.$p').join(',').wrapWith('{}')}
);
${fullPathParams.map((p) => 'final String $p;').join()}
String get path => '$pathWithParams';
}
extension Get$pathClass on $parentPathClass {
$pathClass ${relativePathParams.isEmpty ? 'get $relativePath' : '''
$relativePath({${relativePathParams.map(
(p) => 'required String $p',
).join(',')}})
'''} =>
$pathClass(${fullPathParams.map((p) => '$p: $p').join(',')});
}
''';
return '''
$ret
${children.map((c) => c.generatePathExtensions(path)).join('\n')}
''';
}