(ctx: CtxRef, input: ParseStream)
| 1435 | } |
| 1436 | |
| 1437 | fn parse_def_source(ctx: CtxRef, input: ParseStream) -> syn::Result<Def> { |
| 1438 | let reduce = input.parse::<def::DefSource>()?; |
| 1439 | |
| 1440 | let name = { |
| 1441 | input.parse::<def::name>()?; |
| 1442 | input.parse::<syn::Token![=]>()?; |
| 1443 | input.parse::<syn::Ident>()?.to_string() |
| 1444 | }; |
| 1445 | |
| 1446 | let keys = if input.eat(kw::keys) { |
| 1447 | input.parse::<syn::Token![=]>()?; |
| 1448 | let inner; |
| 1449 | syn::bracketed!(inner in input); |
| 1450 | inner.parse_comma_sep(|input| { |
| 1451 | let inner; |
| 1452 | syn::bracketed!(inner in input); |
| 1453 | inner.parse_comma_sep(scalar::parse_column_index) |
| 1454 | })? |
| 1455 | } else { |
| 1456 | vec![] |
| 1457 | }; |
| 1458 | |
| 1459 | let parse_inputs = ParseChildren::new(input, reduce.span().start()); |
| 1460 | let (cols, column_types) = { |
| 1461 | let source_columns = parse_inputs.parse_many(ctx, parse_def_source_column)?; |
| 1462 | let mut column_names = vec![]; |
| 1463 | let mut column_types = vec![]; |
| 1464 | for (column_name, column_type) in source_columns { |
| 1465 | column_names.push(column_name); |
| 1466 | column_types.push(column_type); |
| 1467 | } |
| 1468 | (column_names, column_types) |
| 1469 | }; |
| 1470 | |
| 1471 | let typ = SqlRelationType { column_types, keys }; |
| 1472 | |
| 1473 | Ok(Def::Source { name, cols, typ }) |
| 1474 | } |
| 1475 | |
| 1476 | fn parse_def_source_column( |
| 1477 | _ctx: CtxRef, |
no test coverage detected